Molassembler  1.0.0
Molecule graph and conformer library
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
ContainerTraits.h
Go to the documentation of this file.
1 
11 #ifndef INCLUDE_MOLASSEMBLER_TEMPLE_CONTAINER_TRAITS_H
12 #define INCLUDE_MOLASSEMBLER_TEMPLE_CONTAINER_TRAITS_H
13 
15 
16 #include <utility>
17 
18 namespace Scine {
19 namespace Molassembler {
20 namespace Temple {
21 namespace Traits {
22 
27 template<class>
28 struct sfinae_true : std::true_type{};
29 
30 namespace Detail {
31 
32 /* Short explanation: If the expression EXPR in sfinae_true<EXPR> returns a
33  * valid type, sfinae_true can be instantiated, and the default-interpretation
34  * of 0 as an int succeeds. If this fails, the backup-interpretation of 0 as a
35  * long is chosen and returns std::false_type.
36  */
37 template<class Container>
38 static auto testHasInsert(int)
39  -> sfinae_true<
40  decltype(
41  std::declval<Container>().insert(
42  std::declval<
43  getValueType<Container>
44  >()
45  )
46  )
47  >;
48 
49 template<class Container>
50 static auto testHasInsert(long) -> std::false_type;
51 } // namespace Detail
52 
53 template<class Container>
54 struct hasInsert : decltype(Detail::testHasInsert<Container>(0)){};
55 
56 namespace Detail {
57 template<class Container>
58 static auto testHasPushBack(int)
59  -> sfinae_true<
60  decltype(
61  std::declval<Container>().push_back(
62  std::declval<
63  getValueType<Container>
64  >()
65  )
66  )
67  >;
68 
69 template<class Container>
70 static auto testHasPushBack(long) -> std::false_type;
71 } // namespace Detail
72 
73 template<class Container>
74 struct hasPushBack : decltype(Detail::testHasPushBack<Container>(0)){};
75 
76 namespace Detail {
77 template<class Container>
78 static auto testHasEmplace(int)
79  -> sfinae_true<
80  decltype(
81  std::declval<Container>().emplace(
82  std::declval<
83  getValueType<Container>
84  >()
85  )
86  )
87  >;
88 
89 template<class Container>
90 static auto testHasEmplace(long) -> std::false_type;
91 } // namespace Detail
92 
93 template<class Container>
94 struct hasEmplace : decltype(Detail::testHasEmplace<Container>(0)){};
95 
96 namespace Detail {
97 template<class Container>
98 static auto testHasEmplaceBack(int)
99  -> sfinae_true<
100  decltype(
101  std::declval<Container>().emplace_back(
102  std::declval<
103  getValueType<Container>
104  >()
105  )
106  )
107  >;
108 
109 template<class Container>
110 static auto testHasEmplaceBack(long) -> std::false_type;
111 } // namespace Detail
112 
113 template<class Container>
114 struct hasEmplaceBack : decltype(Detail::testHasEmplaceBack<Container>(0)){};
115 
116 
117 namespace Detail {
118 template<class Container>
119 static auto testHasSize(int)
120  -> sfinae_true<
121  decltype(
122  std::declval<Container>().size()
123  )
124  >;
125 
126 template<class Container>
127 static auto testHasSize(long) -> std::false_type;
128 } // namespace Detail
129 
130 template<class Container>
131 struct hasSize : decltype(Detail::testHasSize<Container>(0)){};
132 
133 namespace Detail {
134 template<class Container>
135 static auto testHasReserve(int)
136  -> sfinae_true<
137  decltype(
138  std::declval<Container>().reserve()
139  )
140  >;
141 
142 template<class Container>
143 static auto testHasReserve(long) -> std::false_type;
144 } // namespace Detail
145 
146 template<class Container>
147 struct hasReserve : decltype(Detail::testHasReserve<Container>(0)){};
148 
149 } // namespace Traits
150 } // namespace Temple
151 } // namespace Molassembler
152 } // namespace Scine
153 
154 #endif
Definition: ContainerTraits.h:74
Definition: ContainerTraits.h:94
Definition: ContainerTraits.h:131
Definition: ContainerTraits.h:28
Provides a few basic function and container traits.
Definition: ContainerTraits.h:54
Definition: ContainerTraits.h:147