31#ifndef MYSQLX_COMMON_UTIL_H
32#define MYSQLX_COMMON_UTIL_H
44#define PRAGMA(X) __pragma(X)
45#define DISABLE_WARNING(W) PRAGMA(warning (disable:W))
47#define DIAGNOSTIC_PUSH PRAGMA(warning (push))
48#define DIAGNOSTIC_POP PRAGMA(warning (pop))
50#elif defined __GNUC__ || defined __clang__
52#define PRAGMA(X) _Pragma(#X)
53#define DISABLE_WARNING(W) PRAGMA(GCC diagnostic ignored #W)
55#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
56#define DIAGNOSTIC_PUSH PRAGMA(GCC diagnostic push)
57#define DIAGNOSTIC_POP PRAGMA(GCC diagnostic pop)
59#define DIAGNOSTIC_PUSH
66#define DISABLE_WARNING(W)
68#define DIAGNOSTIC_PUSH
92#define PUSH_SYS_WARNINGS \
93 PRAGMA(warning (push,2)) \
94 DISABLE_WARNING(4350) \
95 DISABLE_WARNING(4738) \
96 DISABLE_WARNING(4548) \
97 DISABLE_WARNING(4365) \
98 DISABLE_WARNING(4774) \
103#define PUSH_SYS_WARNINGS DIAGNOSTIC_PUSH
107#define POP_SYS_WARNINGS DIAGNOSTIC_POP
115#include <forward_list>
120#include <type_traits>
134# if __cplusplus >= 201703L
135# define FALLTHROUGH [[fallthrough]]
136# elif __cplusplus >= 201103L
137# define FALLTHROUGH [[gnu::fallthrough]]
139# define FALLTHROUGH __attribute__((fallthrough))
155#ifdef THROW_AS_ASSERT
157#define THROW(MSG) do { assert(false && (MSG)); throw (MSG); } while(false)
161#define THROW(MSG) do { throw_error(MSG); throw (MSG); } while(false)
171#undef DISABLE_WARNING
172#undef DIAGNOSTIC_PUSH
177#define PRAGMA(X) __pragma(X)
178#define DISABLE_WARNING(W) PRAGMA(warning(disable : W))
180#define DIAGNOSTIC_PUSH PRAGMA(warning(push))
181#define DIAGNOSTIC_POP PRAGMA(warning(pop))
183#elif defined __GNUC__ || defined __clang__
185#define PRAGMA(X) _Pragma(#X)
186#define DISABLE_WARNING(W) PRAGMA(GCC diagnostic ignored #W)
188#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
189#define DIAGNOSTIC_PUSH PRAGMA(GCC diagnostic push)
190#define DIAGNOSTIC_POP PRAGMA(GCC diagnostic pop)
192#define DIAGNOSTIC_PUSH
193#define DIAGNOSTIC_POP
199#define DISABLE_WARNING(W)
201#define DIAGNOSTIC_PUSH
202#define DIAGNOSTIC_POP
227#define DLL_WARNINGS_PUSH DIAGNOSTIC_PUSH \
228 DISABLE_WARNING(4251) \
229 DISABLE_WARNING(4275)
230#define DLL_WARNINGS_POP DIAGNOSTIC_POP
234#define DLL_WARNINGS_PUSH
235#define DLL_WARNINGS_POP
247#define enum_class enum
249#define enum_class enum class
293 typename T,
typename U,
294 typename std::enable_if<std::is_unsigned<U>::value>::type* =
nullptr
297bool check_num_limits(U val)
299 using UT =
typename std::make_unsigned<T>::type;
300 return !(val > (UT)std::numeric_limits<T>::max());
304 typename T,
typename U,
305 typename std::enable_if<std::is_unsigned<T>::value>::type* =
nullptr,
306 typename std::enable_if<!std::is_unsigned<U>::value>::type* =
nullptr
309bool check_num_limits(U val)
311 return !(val < 0) && !(val > std::numeric_limits<T>::max());
315 typename T,
typename U,
316 typename std::enable_if<!std::is_unsigned<T>::value>::type* =
nullptr,
317 typename std::enable_if<!std::is_unsigned<U>::value>::type* =
nullptr
320bool check_num_limits(U val)
323 !((val > std::numeric_limits<T>::max())
324 || (val < std::numeric_limits<T>::lowest()));
327#define ASSERT_NUM_LIMITS(T,V) assert(::mysqlx::common::check_num_limits<T>(V))
332std::string to_upper(
const std::string &val)
334 using std::transform;
337 uc_val.resize(val.size());
338 transform(val.begin(), val.end(), uc_val.begin(), ::toupper);
343std::string to_lower(
const std::string &val)
345 using std::transform;
348 uc_val.resize(val.size());
349 transform(val.begin(), val.end(), uc_val.begin(), ::tolower);
358#ifdef USE_NATIVE_BYTE
361 typedef unsigned char byte;
367 nocopy(
const nocopy&) =
delete;
368 nocopy& operator=(
const nocopy&) =
delete;
376 virtual void print(std::ostream&)
const = 0;
377 friend std::ostream& operator<<(std::ostream&,
const Printable&);
381 std::ostream& operator<<(std::ostream &out,
const Printable &obj)
399template <
class CONT,
class PRED>
400void remove_from(CONT &cont, PRED pred)
402 using It =
typename CONT::iterator;
403 It end = std::remove_if(cont.begin(), cont.end(), pred);
404 cont.erase(end, cont.end());