libDwm-0.9.45
DwmFFIVar.hh
Go to the documentation of this file.
1//===========================================================================
2// @(#) $DwmPath$
3//===========================================================================
4// Copyright (c) Daniel W. McRobb 2012, 2023
5// All rights reserved.
6//
7// Redistribution and use in source and binary forms, with or without
8// modification, are permitted provided that the following conditions
9// are met:
10//
11// 1. Redistributions of source code must retain the above copyright
12// notice, this list of conditions and the following disclaimer.
13// 2. Redistributions in binary form must reproduce the above copyright
14// notice, this list of conditions and the following disclaimer in the
15// documentation and/or other materials provided with the distribution.
16// 3. The names of the authors and copyright holders may not be used to
17// endorse or promote products derived from this software without
18// specific prior written permission.
19//
20// IN NO EVENT SHALL DANIEL W. MCROBB BE LIABLE TO ANY PARTY FOR
21// DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
22// INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE,
23// EVEN IF DANIEL W. MCROBB HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
24// DAMAGE.
25//
26// THE SOFTWARE PROVIDED HEREIN IS ON AN "AS IS" BASIS, AND
27// DANIEL W. MCROBB HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT,
28// UPDATES, ENHANCEMENTS, OR MODIFICATIONS. DANIEL W. MCROBB MAKES NO
29// REPRESENTATIONS AND EXTENDS NO WARRANTIES OF ANY KIND, EITHER
30// IMPLIED OR EXPRESS, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31// WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE,
32// OR THAT THE USE OF THIS SOFTWARE WILL NOT INFRINGE ANY PATENT,
33// TRADEMARK OR OTHER RIGHTS.
34//===========================================================================
35
36//---------------------------------------------------------------------------
41//---------------------------------------------------------------------------
42
43#ifndef _DWMFFIVAR_HH_
44#define _DWMFFIVAR_HH_
45
46#include <cassert>
47#include <type_traits>
48
49namespace Dwm {
50
51 //--------------------------------------------------------------------------
76 //--------------------------------------------------------------------------
77
78 //==========================================================================
79
80 //--------------------------------------------------------------------------
82 //--------------------------------------------------------------------------
83 template<class T, class Enable = void>
84 class FFIVar {};
85
86 //--------------------------------------------------------------------------
90 //--------------------------------------------------------------------------
91 template <typename T>
92 class FFIVar<T,typename std::enable_if<std::is_integral<T>::value>::type>
93 {
94 public:
95 //------------------------------------------------------------------------
97 //------------------------------------------------------------------------
99 : _value(0), _invertedValue((T)(~(T)0))
100 { }
101
102 //------------------------------------------------------------------------
104 //------------------------------------------------------------------------
106 {
107 _value = 0;
108 _invertedValue = 0;
109 }
110
111 //------------------------------------------------------------------------
113 //------------------------------------------------------------------------
114 FFIVar(const FFIVar & v) = default;
115
116 //------------------------------------------------------------------------
118 //------------------------------------------------------------------------
119 FFIVar(const T & t)
120 : _value(t), _invertedValue(~_value)
121 {}
122
123 //------------------------------------------------------------------------
125 //------------------------------------------------------------------------
126 FFIVar(FFIVar && v) = default;
127
128 //------------------------------------------------------------------------
130 //------------------------------------------------------------------------
131 FFIVar(T && t)
132 : _value(t), _invertedValue(~_value)
133 {}
134
135 //------------------------------------------------------------------------
137 //------------------------------------------------------------------------
138 FFIVar & operator = (const FFIVar & v) = default;
139
140 //------------------------------------------------------------------------
142 //------------------------------------------------------------------------
143 FFIVar & operator = (const T & t)
144 {
145 _value = t;
146 _invertedValue = ~_value;
147 return *this;
148 }
149
150 //------------------------------------------------------------------------
152 //------------------------------------------------------------------------
153 FFIVar & operator = (FFIVar &&) = default;
154
155 //------------------------------------------------------------------------
157 //------------------------------------------------------------------------
158 FFIVar & operator = (T && t)
159 {
160 _value = t;
161 _invertedValue = ~_value;
162 return *this;
163 }
164
165 //------------------------------------------------------------------------
167 //------------------------------------------------------------------------
168 operator T() const
169 {
170 assert(IsFFI());
171 return _value;
172 }
173
174 //------------------------------------------------------------------------
176 //------------------------------------------------------------------------
177 bool operator <= (const FFIVar & v) const
178 {
179 assert(IsFFI() & v.IsFFI());
180 return (_value <= v._value);
181 }
182
183 //------------------------------------------------------------------------
185 //------------------------------------------------------------------------
186 bool operator >= (const FFIVar & v) const
187 {
188 assert(IsFFI() & v.IsFFI());
189 return (_value >= v._value);
190 }
191
192 //------------------------------------------------------------------------
194 //------------------------------------------------------------------------
195 bool operator < (const FFIVar & v) const
196 {
197 assert(IsFFI() & v.IsFFI());
198 return (! (_value >= v._value));
199 }
200
201 //------------------------------------------------------------------------
203 //------------------------------------------------------------------------
204 bool operator > (const FFIVar & v) const
205 {
206 assert(IsFFI() & v.IsFFI());
207 return (! (_value <= v._value));
208 }
209
210 //------------------------------------------------------------------------
212 //------------------------------------------------------------------------
213 template <typename IT>
214 requires std::is_integral<IT>::value
215 bool operator == (const IT & it) const
216 {
217 assert(IsFFI());
218 return (it == _value);
219 }
220
221 //------------------------------------------------------------------------
223 //------------------------------------------------------------------------
224 bool operator == (const FFIVar & v) const
225 {
226 assert(v.IsFFI() && IsFFI());
227 return(_value == v._value);
228 }
229
230 //------------------------------------------------------------------------
232 //------------------------------------------------------------------------
233 FFIVar operator ++ (int)
234 {
235 assert(IsFFI());
236 T rc = *this;
237 ++_value;
238 _invertedValue = ~_value;
239 return rc;
240 }
241
242 //------------------------------------------------------------------------
244 //------------------------------------------------------------------------
245 FFIVar & operator ++ ()
246 {
247 assert(IsFFI());
248 ++_value;
249 _invertedValue = ~_value;
250 return *this;
251 }
252
253 //------------------------------------------------------------------------
255 //------------------------------------------------------------------------
256 FFIVar operator -- (int)
257 {
258 assert(IsFFI());
259 T rc = *this;
260 --_value;
261 _invertedValue = ~_value;
262 return rc;
263 }
264
265 //------------------------------------------------------------------------
267 //------------------------------------------------------------------------
268 FFIVar & operator -- ()
269 {
270 assert(IsFFI());
271 --_value;
272 _invertedValue = ~_value;
273 return *this;
274 }
275
276 //------------------------------------------------------------------------
278 //------------------------------------------------------------------------
279 FFIVar & operator += (const FFIVar & v)
280 {
281 assert(v.IsFFI());
282 _value += v._value;
283 _invertedValue = ~_value;
284 return *this;
285 }
286
287 //------------------------------------------------------------------------
289 //------------------------------------------------------------------------
290 FFIVar & operator -= (const FFIVar & v)
291 {
292 assert(v.IsFFI());
293 _value -= v._value;
294 _invertedValue = ~_value;
295 return *this;
296 }
297
298 //------------------------------------------------------------------------
300 //------------------------------------------------------------------------
301 FFIVar & operator *= (const FFIVar & v)
302 {
303 assert(v.IsFFI());
304 _value *= v._value;
305 _invertedValue = ~_value;
306 return *this;
307 }
308
309 //------------------------------------------------------------------------
311 //------------------------------------------------------------------------
312 FFIVar & operator /= (const FFIVar & v)
313 {
314 assert(v.IsFFI());
315 assert(v._value);
316 _value /= v._value;
317 _invertedValue = ~_value;
318 return *this;
319 }
320
321 //------------------------------------------------------------------------
323 //------------------------------------------------------------------------
324 FFIVar & operator %= (const FFIVar & v)
325 {
326 assert(v.IsFFI());
327 assert(v._value);
328 _value %= v._value;
329 _invertedValue = ~_value;
330 return *this;
331 }
332
333 //------------------------------------------------------------------------
335 //------------------------------------------------------------------------
336 FFIVar & operator >>= (const FFIVar & v)
337 {
338 assert(v.IsFFI());
339 assert(v._value <= (sizeof(T) * 8));
340 _value >>= v._value;
341 _invertedValue = ~_value;
342 return *this;
343 }
344
345 //------------------------------------------------------------------------
347 //------------------------------------------------------------------------
348 FFIVar & operator <<= (const FFIVar & v)
349 {
350 assert(v.IsFFI());
351 assert(v._value <= (sizeof(T) * 8));
352 _value <<= v._value;
353 _invertedValue = ~_value;
354 return *this;
355 }
356
357 //------------------------------------------------------------------------
359 //------------------------------------------------------------------------
360 FFIVar & operator &= (const FFIVar & v)
361 {
362 assert(v.IsFFI());
363 _value &= v._value;
364 _invertedValue = ~_value;
365 return *this;
366 }
367
368 //------------------------------------------------------------------------
370 //------------------------------------------------------------------------
371 FFIVar & operator |= (const FFIVar & v)
372 {
373 assert(v.IsFFI());
374 _value |= v._value;
375 _invertedValue = ~_value;
376 return *this;
377 }
378
379 //------------------------------------------------------------------------
381 //------------------------------------------------------------------------
382 FFIVar & operator ^= (const FFIVar & v)
383 {
384 assert(v.IsFFI());
385 _value ^= v._value;
386 _invertedValue = ~_value;
387 return *this;
388 }
389
390 //------------------------------------------------------------------------
392 //------------------------------------------------------------------------
393 FFIVar operator ~ () const
394 {
395 return(FFIVar(~_value));
396 }
397
398 //------------------------------------------------------------------------
400 //------------------------------------------------------------------------
401 bool IsFFI() const
402 {
403 return (_value == (T)~(_invertedValue));
404 }
405
406 private:
407 T _value;
408 T _invertedValue;
409 };
410
411 //==========================================================================
412
413 //--------------------------------------------------------------------------
415 //--------------------------------------------------------------------------
416 template <typename T>
417 class FFIVar<T,typename std::enable_if<std::is_floating_point<T>::value>::type>
418 {
419 public:
420 //------------------------------------------------------------------------
422 //------------------------------------------------------------------------
424 : _value(0), _copiedValue(0)
425 { }
426
427 //------------------------------------------------------------------------
429 //------------------------------------------------------------------------
431 {
432 _value = 0;
433 _copiedValue = 1;
434 }
435
436 //------------------------------------------------------------------------
438 //------------------------------------------------------------------------
439 FFIVar(const FFIVar & v) = default;
440
441 //------------------------------------------------------------------------
443 //------------------------------------------------------------------------
444 FFIVar(const T & t)
445 : _value(t), _copiedValue(t)
446 {}
447
448 //------------------------------------------------------------------------
450 //------------------------------------------------------------------------
451 FFIVar(FFIVar && v) = default;
452
453 //------------------------------------------------------------------------
455 //------------------------------------------------------------------------
456 FFIVar(T && t)
457 : _value(t), _copiedValue(_value)
458 {}
459
460 //------------------------------------------------------------------------
462 //------------------------------------------------------------------------
463 FFIVar & operator = (const FFIVar & v) = default;
464
465 //------------------------------------------------------------------------
467 //------------------------------------------------------------------------
468 FFIVar & operator = (const T & t)
469 {
470 _value = t;
471 _copiedValue = _value;
472 return *this;
473 }
474
475 //------------------------------------------------------------------------
477 //------------------------------------------------------------------------
478 FFIVar & operator = (FFIVar &&) = default;
479
480 //------------------------------------------------------------------------
482 //------------------------------------------------------------------------
483 FFIVar & operator = (T && t)
484 {
485 _value = t;
486 _copiedValue = _value;
487 return *this;
488 }
489
490 //------------------------------------------------------------------------
492 //------------------------------------------------------------------------
493 operator T() const
494 {
495 assert(IsFFI());
496 return _value;
497 }
498
499 //------------------------------------------------------------------------
501 //------------------------------------------------------------------------
502 bool operator <= (const FFIVar & v) const
503 {
504 assert(IsFFI() & v.IsFFI());
505 return (_value <= v._value);
506 }
507
508 //------------------------------------------------------------------------
510 //------------------------------------------------------------------------
511 bool operator >= (const FFIVar & v) const
512 {
513 assert(IsFFI() & v.IsFFI());
514 return (_value >= v._value);
515 }
516
517 //------------------------------------------------------------------------
519 //------------------------------------------------------------------------
520 bool operator < (const FFIVar & v) const
521 {
522 assert(IsFFI() & v.IsFFI());
523 return (! (_value >= v._value));
524 }
525
526 //------------------------------------------------------------------------
528 //------------------------------------------------------------------------
529 bool operator > (const FFIVar & v) const
530 {
531 assert(IsFFI() & v.IsFFI());
532 return (! (_value <= v._value));
533 }
534
535 //------------------------------------------------------------------------
537 //------------------------------------------------------------------------
538 template <typename IT>
539 bool operator == (const IT & it) const
540 {
541 assert(IsFFI());
542 return (it == _value);
543 }
544
545 //------------------------------------------------------------------------
547 //------------------------------------------------------------------------
548 bool operator == (const FFIVar & v) const
549 {
550 assert(v.IsFFI() && IsFFI());
551 return(_value == v._value);
552 }
553
554 //------------------------------------------------------------------------
556 //------------------------------------------------------------------------
557 FFIVar & operator += (const FFIVar & v)
558 {
559 assert(v.IsFFI());
560 _value += v._value;
561 _copiedValue = _value;
562 return *this;
563 }
564
565 //------------------------------------------------------------------------
567 //------------------------------------------------------------------------
568 FFIVar & operator -= (const FFIVar & v)
569 {
570 assert(v.IsFFI());
571 _value -= v._value;
572 _copiedValue = _value;
573 return *this;
574 }
575
576 //------------------------------------------------------------------------
578 //------------------------------------------------------------------------
579 FFIVar & operator *= (const FFIVar & v)
580 {
581 assert(v.IsFFI());
582 _value *= v._value;
583 _copiedValue = _value;
584 return *this;
585 }
586
587 //------------------------------------------------------------------------
589 //------------------------------------------------------------------------
590 FFIVar & operator /= (const FFIVar & v)
591 {
592 assert(v.IsFFI());
593 assert(v._value);
594 _value /= v._value;
595 _copiedValue = _value;
596 return *this;
597 }
598
599 //------------------------------------------------------------------------
601 //------------------------------------------------------------------------
602 bool IsFFI() const
603 {
604 return (_value == _copiedValue);
605 }
606
607 private:
608 T _value;
609 T _copiedValue;
610 };
611
612 //==========================================================================
613
614 //--------------------------------------------------------------------------
617 //--------------------------------------------------------------------------
618 template <typename T>
619 class FFIVar<T,typename std::enable_if<std::is_pointer<T>::value>::type>
620 {
621 public:
622 //------------------------------------------------------------------------
624 //------------------------------------------------------------------------
626 : _value(nullptr)
627 {
628 SetFlippedValue();
629 }
630
631 //------------------------------------------------------------------------
633 //------------------------------------------------------------------------
635 {
636 _value = nullptr;
637 _flippedValue = nullptr;
638 }
639
640 //------------------------------------------------------------------------
642 //------------------------------------------------------------------------
643 FFIVar(const FFIVar & v) = default;
644
645 //------------------------------------------------------------------------
647 //------------------------------------------------------------------------
648 FFIVar(const T & t)
649 : _value(t)
650 {
651 SetFlippedValue();
652 }
653
654 //------------------------------------------------------------------------
656 //------------------------------------------------------------------------
657 FFIVar(FFIVar && v) = default;
658
659 //------------------------------------------------------------------------
661 //------------------------------------------------------------------------
662 FFIVar(T && t)
663 : _value(t)
664 {
665 SetFlippedValue();
666 }
667
668 //------------------------------------------------------------------------
670 //------------------------------------------------------------------------
671 FFIVar & operator = (const FFIVar & v) = default;
672
673 //------------------------------------------------------------------------
675 //------------------------------------------------------------------------
676 FFIVar & operator = (const T & t)
677 {
678 _value = t;
679 SetFlippedValue();
680 return *this;
681 }
682
683 //------------------------------------------------------------------------
685 //------------------------------------------------------------------------
686 FFIVar & operator = (FFIVar &&) = default;
687
688 //------------------------------------------------------------------------
690 //------------------------------------------------------------------------
691 FFIVar & operator = (T && t)
692 {
693 _value = t;
694 SetFlippedValue();
695 return *this;
696 }
697
698 //------------------------------------------------------------------------
700 //------------------------------------------------------------------------
701 operator T() const
702 {
703 assert(IsFFI());
704 return _value;
705 }
706
707 //------------------------------------------------------------------------
709 //------------------------------------------------------------------------
710 template <typename IT>
711 bool operator == (const IT & it) const
712 {
713 assert(IsFFI());
714 return (it == _value);
715 }
716
717 //------------------------------------------------------------------------
719 //------------------------------------------------------------------------
720 bool operator == (const FFIVar & v) const
721 {
722 assert(v.IsFFI() && IsFFI());
723 return(_value == v._value);
724 }
725
726 //------------------------------------------------------------------------
728 //------------------------------------------------------------------------
729 FFIVar operator ++ (int)
730 {
731 assert(IsFFI());
732 T rc = *this;
733 ++_value;
734 SetFlippedValue();
735 return rc;
736 }
737
738 //------------------------------------------------------------------------
740 //------------------------------------------------------------------------
741 FFIVar & operator ++ ()
742 {
743 assert(IsFFI());
744 ++_value;
745 SetFlippedValue();
746 return *this;
747 }
748
749 //------------------------------------------------------------------------
751 //------------------------------------------------------------------------
752 FFIVar operator -- (int)
753 {
754 assert(IsFFI());
755 T rc = *this;
756 --_value;
757 SetFlippedValue();
758 return rc;
759 }
760
761 //------------------------------------------------------------------------
763 //------------------------------------------------------------------------
764 FFIVar & operator -- ()
765 {
766 assert(IsFFI());
767 --_value;
768 SetFlippedValue();
769 return *this;
770 }
771
772 //------------------------------------------------------------------------
774 //------------------------------------------------------------------------
775 FFIVar & operator += (const FFIVar & v)
776 {
777 assert(v.IsFFI());
778 _value += v._value;
779 SetFlippedValue();
780 return *this;
781 }
782
783 //------------------------------------------------------------------------
785 //------------------------------------------------------------------------
786 FFIVar & operator -= (const FFIVar & v)
787 {
788 assert(v.IsFFI());
789 _value -= v._value;
790 SetFlippedValue();
791 return *this;
792 }
793
794 //------------------------------------------------------------------------
796 //------------------------------------------------------------------------
797 bool IsFFI() const
798 {
799 static_assert(sizeof(T) == sizeof(size_t));
800 const size_t *pv = (const size_t *)&_value;
801 const size_t *pf = (const size_t *)&_flippedValue;
802 return (*pf == (size_t)~(*pv));
803 }
804
805 private:
806 T _value;
807 T _flippedValue;
808
809 //------------------------------------------------------------------------
811 //------------------------------------------------------------------------
812 void SetFlippedValue()
813 {
814 static_assert(sizeof(T) == sizeof(size_t));
815 const size_t *ps = (const size_t *)&_value;
816 size_t *pd = (size_t *)&_flippedValue;
817 *pd = ~(*ps);
818 return;
819 }
820 };
821
822 //==========================================================================
824 //==========================================================================
825
826 //--------------------------------------------------------------------------
828 //--------------------------------------------------------------------------
829 template <typename T1, typename T2>
830 concept AreFFI_Addable = requires(T1 a, T2 b) {
831 { a + b } -> std::same_as<T1>;
832 };
833
834 //--------------------------------------------------------------------------
836 //--------------------------------------------------------------------------
837 template <typename T1, typename T2>
838 concept AreFFI_Subtractable = requires(T1 a, T2 b) {
839 { a - b } -> std::same_as<T1>;
840 };
841
842 //--------------------------------------------------------------------------
844 //--------------------------------------------------------------------------
845 template <typename T1, typename T2>
846 concept AreFFI_Dividable = requires(T1 a, T2 b) {
847 { a / b } -> std::same_as<T1>;
848 };
849
850 //--------------------------------------------------------------------------
852 //--------------------------------------------------------------------------
853 template <typename T1, typename T2>
854 concept AreFFI_Moduloable = requires(T1 a, T2 b) {
855 { a % b } -> std::same_as<T1>;
856 };
857
858 //--------------------------------------------------------------------------
860 //--------------------------------------------------------------------------
861 template <typename T1, typename T2>
862 concept AreFFI_Multipliable = requires(T1 a, T2 b) {
863 { a * b } -> std::same_as<T1>;
864 };
865
866 //==========================================================================
868 //==========================================================================
869
870 //--------------------------------------------------------------------------
872 //--------------------------------------------------------------------------
873 template <typename T1, typename T2,
874 typename std::enable_if<AreFFI_Addable<T1,T2>>>
875 FFIVar<T1> operator + (FFIVar<T1> lhs, FFIVar<T2> rhs)
876 { lhs += rhs; return lhs; }
877
878 //--------------------------------------------------------------------------
880 //--------------------------------------------------------------------------
881 template <typename T1, typename T2,
882 typename std::enable_if<AreFFI_Subtractable<T1,T2>>>
883 FFIVar<T1> operator - (FFIVar<T1> lhs, FFIVar<T2> rhs)
884 { lhs -= rhs; return lhs; }
885
886 //--------------------------------------------------------------------------
888 //--------------------------------------------------------------------------
889 template <typename T1, typename T2,
890 typename std::enable_if<AreFFI_Multipliable<T1,T2>>>
891 FFIVar<T1> operator * (FFIVar<T1> lhs, FFIVar<T2> rhs)
892 { lhs *= rhs; return lhs; }
893
894 //--------------------------------------------------------------------------
896 //--------------------------------------------------------------------------
897 template <typename T1, typename T2,
898 typename std::enable_if<AreFFI_Dividable<T1,T2>>>
899 FFIVar<T1> operator / (FFIVar<T1> lhs, FFIVar<T2> rhs)
900 { lhs /= rhs; return lhs; }
901
902 //--------------------------------------------------------------------------
904 //--------------------------------------------------------------------------
905 template <typename T1, typename T2,
906 typename std::enable_if<AreFFI_Moduloable<T1,T2>>>
907 FFIVar<T1> operator % (FFIVar<T1> lhs, FFIVar<T2> rhs)
908 { lhs %= rhs; return lhs; }
909
910 //--------------------------------------------------------------------------
912 //--------------------------------------------------------------------------
913 template <typename T,
914 typename std::enable_if<std::is_integral<T>::value>::type>
915 FFIVar<T> operator >> (FFIVar<T> lhs, FFIVar<T> rhs)
916 { lhs >>= rhs; return lhs; }
917
918 //--------------------------------------------------------------------------
920 //--------------------------------------------------------------------------
921 template <typename T,
922 typename std::enable_if<std::is_integral<T>::value>::type>
923 FFIVar<T> operator << (FFIVar<T> lhs, FFIVar<T> rhs)
924 { lhs <<= rhs; return lhs; }
925
926 //--------------------------------------------------------------------------
928 //--------------------------------------------------------------------------
929 template <typename T,
930 typename std::enable_if<std::is_integral<T>::value>::type>
931 FFIVar<T> operator & (FFIVar<T> lhs, FFIVar<T> rhs)
932 { lhs &= rhs; return lhs; }
933
934 //--------------------------------------------------------------------------
936 //--------------------------------------------------------------------------
937 template <typename T,
938 typename std::enable_if<std::is_integral<T>::value>::type>
939 FFIVar<T> operator | (FFIVar<T> lhs, FFIVar<T> rhs)
940 { lhs |= rhs; return lhs; }
941
942 //--------------------------------------------------------------------------
944 //--------------------------------------------------------------------------
945 template <typename T,
946 typename std::enable_if<std::is_integral<T>::value>::type>
947 FFIVar<T> operator ^ (FFIVar<T> lhs, FFIVar<T> rhs)
948 { lhs ^= rhs; return lhs; }
949
950
951} // namespace Dwm
952
953#endif // _DWMFFIVAR_HH_
bool operator==(const std::unordered_map< _keyT, _valueT, _Hash, _Pred, _Alloc > &a, const std::unordered_map< _keyT, _valueT, _Hash, _Pred, _Alloc > &b)
operator == for unordered_map.
Definition DwmOperators.hh:57
FFIVar(T &&t)
Construct from an rvalue reference to a T.
Definition DwmFFIVar.hh:456
bool IsFFI() const
Returns true if object appears to be free from interference.
Definition DwmFFIVar.hh:602
FFIVar(const T &t)
Construct from a reference to a T.
Definition DwmFFIVar.hh:444
bool IsFFI() const
Returns true if object appears to be free from interference.
Definition DwmFFIVar.hh:401
FFIVar(T &&t)
Construct from an rvalue reference to a T.
Definition DwmFFIVar.hh:131
FFIVar(const T &t)
Construct from a reference to a T.
Definition DwmFFIVar.hh:119
FFIVar(T &&t)
Move construct from a T.
Definition DwmFFIVar.hh:662
FFIVar(const T &t)
Construct from a T.
Definition DwmFFIVar.hh:648
bool IsFFI() const
Returns true if object appears to be free from interference.
Definition DwmFFIVar.hh:797
The main idea here is to encpasulate a scalar type to provide protection from interference.
Definition DwmFFIVar.hh:84
Concepts to apply to binary operators.
Definition DwmFFIVar.hh:830
T1 can be divided by T2 and yield a T1. i.e. { T1 / T2 } -> T1.
Definition DwmFFIVar.hh:846
T1 modulo T2 yields a T1. i.e. { T1 % T2 } -> T1.
Definition DwmFFIVar.hh:854
T1 can be multiplied by T2 and yield a T1. i.e. { T1 * T2 } -> T1.
Definition DwmFFIVar.hh:862
T2 can be subtracted from T1 and yield a T1. i.e. { T1 - T2 } -> T1.
Definition DwmFFIVar.hh:838