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