/src/mdds-3.1.0/include/mdds/global.hpp
Line | Count | Source |
1 | | /************************************************************************* |
2 | | * |
3 | | * Copyright (c) 2008-2020 Kohei Yoshida |
4 | | * |
5 | | * Permission is hereby granted, free of charge, to any person |
6 | | * obtaining a copy of this software and associated documentation |
7 | | * files (the "Software"), to deal in the Software without |
8 | | * restriction, including without limitation the rights to use, |
9 | | * copy, modify, merge, publish, distribute, sublicense, and/or sell |
10 | | * copies of the Software, and to permit persons to whom the |
11 | | * Software is furnished to do so, subject to the following |
12 | | * conditions: |
13 | | * |
14 | | * The above copyright notice and this permission notice shall be |
15 | | * included in all copies or substantial portions of the Software. |
16 | | * |
17 | | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
18 | | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
19 | | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
20 | | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
21 | | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
22 | | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
23 | | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
24 | | * OTHER DEALINGS IN THE SOFTWARE. |
25 | | * |
26 | | ************************************************************************/ |
27 | | |
28 | | #ifndef INCLUDED_MDDS_GLOBAL_HPP |
29 | | #define INCLUDED_MDDS_GLOBAL_HPP |
30 | | |
31 | | #include <exception> |
32 | | #include <string> |
33 | | #include <memory> |
34 | | #include <utility> |
35 | | #include <type_traits> |
36 | | |
37 | | /** |
38 | | * \def MDDS_ASCII(literal) |
39 | | * |
40 | | * Expands a \a literal string into two arguments: the first one is the |
41 | | * literal string itself, and the second one is the length of that string. |
42 | | * |
43 | | * Note that this macro only works with literal strings defined inline; it |
44 | | * does not work with pointer values that point to strings defined |
45 | | * elsewhere. |
46 | | */ |
47 | | #define MDDS_ASCII(literal) literal, sizeof(literal) - 1 |
48 | | |
49 | | /** |
50 | | * \def MDDS_N_ELEMENTS(name) |
51 | | * |
52 | | * Calculates the length of \a name array provided that the array definition |
53 | | * is given in the same compilation unit. |
54 | | * |
55 | | * @deprecated Please use \c std::size instead. |
56 | | */ |
57 | | #define MDDS_N_ELEMENTS(name) sizeof(name) / sizeof(name[0]) |
58 | | |
59 | | #ifdef __GNUC__ |
60 | | #define MDDS_DEPRECATED __attribute__((deprecated)) |
61 | | #elif defined(_MSC_VER) |
62 | | #define MDDS_DEPRECATED __declspec(deprecated) |
63 | | #else |
64 | | #define MDDS_DEPRECATED |
65 | | #endif |
66 | | |
67 | | #ifndef MDDS_LOOP_UNROLLING |
68 | | #define MDDS_LOOP_UNROLLING 1 |
69 | | #endif |
70 | | |
71 | | #ifndef MDDS_USE_OPENMP |
72 | | #define MDDS_USE_OPENMP 0 |
73 | | #endif |
74 | | |
75 | | #if defined(__AVX__) || defined(__AVX2__) |
76 | | #ifndef __SSE2__ |
77 | | #define __SSE2__ 1 |
78 | | #endif |
79 | | #endif |
80 | | |
81 | | namespace mdds { |
82 | | |
83 | | class general_error : public ::std::exception |
84 | | { |
85 | | public: |
86 | 0 | general_error(const ::std::string& msg) : m_msg(msg) |
87 | 0 | {} |
88 | | virtual ~general_error() noexcept |
89 | 0 | {} |
90 | | |
91 | | virtual const char* what() const noexcept |
92 | 0 | { |
93 | 0 | return m_msg.c_str(); |
94 | 0 | } |
95 | | |
96 | | private: |
97 | | ::std::string m_msg; |
98 | | }; |
99 | | |
100 | | class invalid_arg_error : public general_error |
101 | | { |
102 | | public: |
103 | | invalid_arg_error(const ::std::string& msg) : general_error(msg) |
104 | 0 | {} |
105 | | }; |
106 | | |
107 | | class size_error : public general_error |
108 | | { |
109 | | public: |
110 | | size_error(const std::string& msg) : general_error(msg) |
111 | 0 | {} |
112 | | }; |
113 | | |
114 | | class type_error : public general_error |
115 | | { |
116 | | public: |
117 | | type_error(const std::string& msg) : general_error(msg) |
118 | 0 | {} |
119 | | }; |
120 | | |
121 | | class integrity_error : public general_error |
122 | | { |
123 | | public: |
124 | | integrity_error(const std::string& msg) : general_error(msg) |
125 | 0 | {} |
126 | | }; |
127 | | |
128 | | namespace detail { |
129 | | |
130 | | template<typename T> |
131 | | class has_value_type |
132 | | { |
133 | | using y_type = char; |
134 | | using n_type = long; |
135 | | |
136 | | template<typename U> |
137 | | static y_type test(typename U::value_type); |
138 | | template<typename U> |
139 | | static n_type test(...); |
140 | | |
141 | | public: |
142 | | static constexpr bool value = sizeof(test<T>(0)) == sizeof(y_type); |
143 | | }; |
144 | | |
145 | | template<typename T, typename IsConst> |
146 | | struct const_or_not; |
147 | | |
148 | | template<typename T> |
149 | | struct const_or_not<T, std::true_type> |
150 | | { |
151 | | using type = typename std::add_const<T>::type; |
152 | | }; |
153 | | |
154 | | template<typename T> |
155 | | struct const_or_not<T, std::false_type> |
156 | | { |
157 | | using type = T; |
158 | | }; |
159 | | |
160 | | template<typename T, bool Const> |
161 | | using const_t = typename const_or_not<T, std::bool_constant<Const>>::type; |
162 | | |
163 | | template<typename T, typename Mutable> |
164 | | struct mutable_or_not; |
165 | | |
166 | | template<typename T> |
167 | | struct mutable_or_not<T, std::true_type> |
168 | | { |
169 | | using type = T; |
170 | | }; |
171 | | |
172 | | template<typename T> |
173 | | struct mutable_or_not<T, std::false_type> |
174 | | { |
175 | | using type = typename std::add_const<T>::type; |
176 | | }; |
177 | | |
178 | | template<typename T, bool Mutable> |
179 | | using mutable_t = typename mutable_or_not<T, std::bool_constant<Mutable>>::type; |
180 | | |
181 | | template<typename T, typename IsConst> |
182 | | struct get_iterator_type; |
183 | | |
184 | | template<typename T> |
185 | | struct get_iterator_type<T, std::true_type> |
186 | | { |
187 | | using type = typename T::const_iterator; |
188 | | }; |
189 | | |
190 | | template<typename T> |
191 | | struct get_iterator_type<T, std::false_type> |
192 | | { |
193 | | using type = typename T::iterator; |
194 | | }; |
195 | | |
196 | | template<int T> |
197 | | constexpr bool invalid_static_int() |
198 | | { |
199 | | return false; |
200 | | } |
201 | | |
202 | | template<typename T, typename = void> |
203 | | struct is_complete : std::false_type |
204 | | { |
205 | | }; |
206 | | |
207 | | template<typename T> |
208 | | struct is_complete<T, std::void_t<decltype(sizeof(T) != 0)>> : std::true_type |
209 | | { |
210 | | }; |
211 | | |
212 | | } // namespace detail |
213 | | |
214 | | } // namespace mdds |
215 | | |
216 | | #endif |