Remote Call Framework 3.3
TypeTraits.hpp
1 
2 //******************************************************************************
3 // RCF - Remote Call Framework
4 //
5 // Copyright (c) 2005 - 2022, Delta V Software. All rights reserved.
6 // https://www.deltavsoft.com
7 //
8 // RCF is distributed under dual licenses - closed source or GPL.
9 // Consult your particular license for conditions of use.
10 //
11 // If you have not purchased a commercial license, you are using RCF under GPL terms.
12 //
13 // Version: 3.3
14 // Contact: support <at> deltavsoft.com
15 //
16 //******************************************************************************
17 
18 #ifndef INCLUDE_RCF_TYPETRAITS_HPP
19 #define INCLUDE_RCF_TYPETRAITS_HPP
20 
21 #include <type_traits>
22 
23 namespace RCF {
24 
25  typedef std::true_type TrueType;
26  typedef std::false_type FalseType;
27 
28  template<int N> using Int = std::integral_constant<int, N>;
29  template<bool B> using Bool = std::integral_constant<bool, B>;
30  template<typename C, typename T1, typename T2> using If = std::conditional<C::value, T1, T2>;
31 
32  //template<typename T1, typename T2> using And = std::conjunction<T1, T2>;
33 
34  // Homebrew replacement as std::conjunction not widely available (requires VS 2015 Update 2).
35  template<typename T1, typename T2> class AndImpl;
36  template<> class AndImpl<TrueType, TrueType> : public TrueType {};
37  template<> class AndImpl<TrueType, FalseType> : public FalseType {};
38  template<> class AndImpl<FalseType, TrueType> : public FalseType {};
39  template<> class AndImpl<FalseType, FalseType> : public FalseType {};
40  template<typename T1, typename T2> class And : public AndImpl<typename T1::type, typename T2::type> {};
41 
42  //template<typename T1, typename T2> using Or = std::disjunction<T1, T2>;
43 
44  // Homebrew replacement as std::disjunction not widely available (requires VS 2015 Update 2).
45  template<typename T1, typename T2> class OrImpl;
46  template<> class OrImpl<TrueType, TrueType> : public TrueType {};
47  template<> class OrImpl<TrueType, FalseType> : public FalseType {};
48  template<> class OrImpl<FalseType, TrueType> : public FalseType {};
49  template<> class OrImpl<FalseType, FalseType> : public FalseType {};
50  template<typename T1, typename T2> class Or : public OrImpl<typename T1::type, typename T2::type> {};
51 
52  //template<typename T1> using Not = std::negation<T1, T2>;
53 
54  // Homebrew replacement as std::negation not widely available (requires VS 2015 Update 2).
55  template<typename T1> class NotImpl;
56  template<> class NotImpl<TrueType> : public FalseType {};
57  template<> class NotImpl<FalseType> : public TrueType {};
58  template<typename T1> class Not : public NotImpl<typename T1::type> {};
59 
60  template<typename T> using IsFundamental = std::is_fundamental<T>;
61  template<typename T> using IsConst = std::is_const<T>;
62  template<typename T> using IsPointer = std::is_pointer<T>;
63  template<typename T> using IsReference = std::is_reference<T>;
64  template<typename T> using RemovePointer = std::remove_pointer<T>;
65  template<typename T> using RemoveReference = std::remove_reference<T>;
66  template<typename T> using RemoveCv = std::remove_cv<T>;
67 
68  template<typename T> struct Out {};
69 
70  template<typename T> struct RemoveOut { typedef T type; };
71  template<typename T> struct RemoveOut< Out<T> > { typedef T type; };
72 
73  template<typename T> struct IsOut : public RCF::FalseType {};
74  template<typename T> struct IsOut< Out<T> > {
75  typedef TrueType type;
76  enum { value = type::value };
77  };
78 
79 } // namespace RCF
80 
81 #endif // ! INCLUDE_RCF_TYPETRAITS_HPP
Definition: AmiIoHandler.hpp:23