83 template<
class T,
class Enable =
void>
92 class FFIVar<T,typename std::enable_if<std::is_integral<T>::value>::type>
99 : _value(0), _invertedValue((T)(~(T)0))
120 : _value(t), _invertedValue(~_value)
132 : _value(t), _invertedValue(~_value)
146 _invertedValue = ~_value;
161 _invertedValue = ~_value;
177 bool operator <= (
const FFIVar & v)
const
179 assert(IsFFI() & v.IsFFI());
180 return (_value <= v._value);
186 bool operator >= (
const FFIVar & v)
const
188 assert(IsFFI() & v.IsFFI());
189 return (_value >= v._value);
197 assert(IsFFI() & v.IsFFI());
198 return (! (_value >= v._value));
206 assert(IsFFI() & v.IsFFI());
207 return (! (_value <= v._value));
213 template <
typename IT>
214 requires std::is_integral<IT>::value
218 return (it == _value);
226 assert(v.IsFFI() && IsFFI());
227 return(_value == v._value);
238 _invertedValue = ~_value;
249 _invertedValue = ~_value;
261 _invertedValue = ~_value;
272 _invertedValue = ~_value;
283 _invertedValue = ~_value;
294 _invertedValue = ~_value;
305 _invertedValue = ~_value;
317 _invertedValue = ~_value;
329 _invertedValue = ~_value;
339 assert(v._value <= (
sizeof(T) * 8));
341 _invertedValue = ~_value;
351 assert(v._value <= (
sizeof(T) * 8));
353 _invertedValue = ~_value;
364 _invertedValue = ~_value;
375 _invertedValue = ~_value;
386 _invertedValue = ~_value;
403 return (_value == (T)~(_invertedValue));
416 template <
typename T>
417 class FFIVar<T,typename std::enable_if<std::is_floating_point<T>::value>::type>
424 : _value(0), _copiedValue(0)
445 : _value(t), _copiedValue(t)
457 : _value(t), _copiedValue(_value)
471 _copiedValue = _value;
486 _copiedValue = _value;
502 bool operator <= (
const FFIVar & v)
const
504 assert(IsFFI() & v.IsFFI());
505 return (_value <= v._value);
511 bool operator >= (
const FFIVar & v)
const
513 assert(IsFFI() & v.IsFFI());
514 return (_value >= v._value);
522 assert(IsFFI() & v.IsFFI());
523 return (! (_value >= v._value));
531 assert(IsFFI() & v.IsFFI());
532 return (! (_value <= v._value));
538 template <
typename IT>
542 return (it == _value);
550 assert(v.IsFFI() && IsFFI());
551 return(_value == v._value);
561 _copiedValue = _value;
572 _copiedValue = _value;
583 _copiedValue = _value;
595 _copiedValue = _value;
604 return (_value == _copiedValue);
618 template <
typename T>
619 class FFIVar<T,typename std::enable_if<std::is_pointer<T>::value>::type>
637 _flippedValue =
nullptr;
710 template <
typename IT>
714 return (it == _value);
722 assert(v.IsFFI() && IsFFI());
723 return(_value == v._value);
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));
812 void SetFlippedValue()
814 static_assert(
sizeof(T) ==
sizeof(
size_t));
815 const size_t *ps = (
const size_t *)&_value;
816 size_t *pd = (
size_t *)&_flippedValue;
829 template <
typename T1,
typename T2>
831 { a + b } -> std::same_as<T1>;
837 template <
typename T1,
typename T2>
839 { a - b } -> std::same_as<T1>;
845 template <
typename T1,
typename T2>
847 { a / b } -> std::same_as<T1>;
853 template <
typename T1,
typename T2>
855 { a % b } -> std::same_as<T1>;
861 template <
typename T1,
typename T2>
863 { a * b } -> std::same_as<T1>;
873 template <
typename T1,
typename T2,
874 typename std::enable_if<AreFFI_Addable<T1,T2>>>
876 { lhs += rhs;
return lhs; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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(const FFIVar &v)=default
Copy constructor.
FFIVar(FFIVar &&v)=default
Move constructor.
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
~FFIVar()
Destructor.
Definition DwmFFIVar.hh:430
FFIVar()
Default constructor.
Definition DwmFFIVar.hh:423
bool IsFFI() const
Returns true if object appears to be free from interference.
Definition DwmFFIVar.hh:401
FFIVar(const FFIVar &v)=default
Copy constructor.
FFIVar(FFIVar &&v)=default
Move constructor.
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()
Destructor.
Definition DwmFFIVar.hh:105
FFIVar()
Default constructor.
Definition DwmFFIVar.hh:98
FFIVar()
Default constructor.
Definition DwmFFIVar.hh:625
~FFIVar()
Destructor.
Definition DwmFFIVar.hh:634
FFIVar(const FFIVar &v)=default
Copy constructor.
FFIVar(T &&t)
Move construct from a T.
Definition DwmFFIVar.hh:662
FFIVar(const T &t)
Construct from a T.
Definition DwmFFIVar.hh:648
FFIVar(FFIVar &&v)=default
Move constructor.
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