29using type_t =
typename T::type;
33using value_type_t =
typename T::value_type;
35template <
bool B,
typename T =
void>
36using enable_if_t =
typename std::enable_if<B, T>::type;
38#pragma push_macro("DECL_ALIAS")
40#define DECL_ALIAS(Name) \
41 template <typename T> \
42 using Name##_t = type_t<std::Name<T>>
44DECL_ALIAS(make_signed);
45DECL_ALIAS(make_unsigned);
46DECL_ALIAS(remove_reference);
47DECL_ALIAS(remove_const);
48DECL_ALIAS(remove_volatile);
49DECL_ALIAS(remove_pointer);
51DECL_ALIAS(add_pointer);
53DECL_ALIAS(add_volatile);
54DECL_ALIAS(add_lvalue_reference);
55DECL_ALIAS(add_rvalue_reference);
56#pragma pop_macro("DECL_ALIAS")
58template <
typename... Ts>
59using common_type_t = type_t<std::common_type<Ts...>>;
63using remove_cvref_t = remove_cv_t<remove_reference_t<T>>;
67using const_reference_t = add_lvalue_reference_t<remove_cvref_t<T>
const>;
78template <
typename... Ts>
80#if defined(_MSC_VER) && _MSC_VER < 1910
83 typename just_void<Ts...>
::type;
90using bool_constant = std::integral_constant<bool, B>;
99namespace impl_detection {
104 template <
class...>
class Oper,
110 typename SfinaeHere = Oper<Args...>>
111std::true_type is_detected_f(mp_list<Args...>*);
115template <
template <
class...>
class Oper>
116std::false_type is_detected_f(...);
119template <
bool IsDetected>
124struct detection<false> {
126 template <
typename Default,
template <
class...>
class,
typename...>
132struct detection<true> {
133 template <
typename,
template <
class...>
class Oper,
typename... Args>
134 using f = Oper<Args...>;
139template <
typename Dflt,
typename Void,
template <
class...>
class Oper,
typename... Args>
140struct vc140_detection {
144template <
typename Dflt,
template <
class...>
class Oper,
typename... Args>
145struct vc140_detection<Dflt, void_t<Oper<Args...>>, Oper, Args...> {
146 using type = Oper<Args...>;
153 ~nonesuch() =
delete;
154 nonesuch(nonesuch
const&) =
delete;
155 void operator=(nonesuch
const&) =
delete;
163template <
template <
class...>
class Oper,
typename... Args>
164struct is_detected : decltype(impl_detection::is_detected_f<Oper>(static_cast<mp_list<Args...>*>(nullptr))) {};
171template <
typename Dflt,
template <
class...>
class Oper,
typename... Args>
173#if defined(_MSC_VER) && _MSC_VER < 1910
174 typename impl_detection::vc140_detection<Dflt, void, Oper, Args...>
::type
176 typename impl_detection::detection<is_detected<Oper, Args...>::value>::template f<Dflt, Oper, Args...>
185template <
template <
class...>
class Oper,
typename... Args>
186using detected_t = detected_or<nonesuch, Oper, Args...>;
194 template <
typename IfTrue,
typename>
199struct conditional<false> {
200 template <
typename,
typename IfFalse>
209template <
bool B,
typename T,
typename F>
210using conditional_t =
typename conditional<B>::template f<T, F>;
213namespace impl_logic {
215template <
typename FalseType,
typename Opers>
218template <
typename H,
typename... Tail>
219struct conj<bool_constant<H::value || !sizeof...(Tail)>, mp_list<H, Tail...>> : H {};
221template <
typename F,
typename H,
typename... Tail>
222struct conj<F, mp_list<H, Tail...>> : conj<F, mp_list<Tail...>> {};
225struct conj<std::false_type, mp_list<H>> : H {};
228struct conj<std::false_type, mp_list<>> : std::true_type {};
230template <
typename TrueType,
typename Opers>
233template <
typename H,
typename... Tail>
234struct disj<bool_constant<H::value && sizeof...(Tail)>, mp_list<H, Tail...>> : H {};
236template <
typename F,
typename H,
typename... Tail>
237struct disj<F, mp_list<H, Tail...>> : disj<F, mp_list<Tail...>> {};
240struct disj<std::true_type, mp_list<H>> : H {};
243struct disj<std::true_type, mp_list<>> : std::false_type {};
254template <
typename... Cond>
255struct conjunction : impl_logic::conj<std::false_type, mp_list<Cond...>> {};
263template <
typename... Cond>
264struct disjunction : impl_logic::disj<std::true_type, mp_list<Cond...>> {};
270struct negation : bool_constant<!T::value> {};
276template <
typename...>
277using true_t = std::true_type;
279namespace impl_requires {
282R norm_conjunction(R
const&);
284template <
typename R,
typename... Cs>
285conjunction<Cs...> norm_conjunction(conjunction<Cs...>
const&);
288using norm_conjunction_t =
decltype(norm_conjunction<T>(std::declval<T const&>()));
290template <
typename Constra
int,
typename =
void>
293template <
typename FailingRequirement>
294struct failed_requirement {
295 failed_requirement(
int) =
delete;
297 template <
typename T>
298 static T explain(failed_requirement);
301template <
typename... SubRequirements>
302struct failed_requirement<conjunction<SubRequirements...>> {
303 failed_requirement(
int) =
delete;
305 template <
typename T>
306 static auto explain(
int) -> common_type_t<
decltype(requirement<SubRequirements>::test::template explain<T>(0))...>;
309template <
typename Constra
int,
typename>
311 using test = failed_requirement<impl_requires::norm_conjunction_t<Constraint>>;
314template <
typename Constra
int>
315struct requirement<Constraint, enable_if_t<Constraint::value>> {
317 template <
typename T>
318 static T explain(
int);
330template <
typename Type,
typename... Traits>
331#if defined _MSC_VER && _MSC_VER < 1920
333using requires_t = enable_if_t<conjunction<Traits...>::value, Type>;
336using requires_t =
decltype(impl_requires::requirement<conjunction<Traits...>>::test::template explain<Type>(0));
345template <
typename Type,
typename... Traits>
346using requires_not_t = requires_t<Type, negation<disjunction<Traits...>>>;
349namespace impl_invoke {
351template <
bool IsMemberObject,
bool IsMemberFunction>
353 template <
typename F,
typename... Args>
354 constexpr static auto apply(F&& fun, Args&&... args)
355 BSONCXX_PRIVATE_RETURNS(
static_cast<F&&
>(fun)(
static_cast<Args&&
>(args)...));
359struct invoker<false, true> {
360 template <
typename F,
typename Self,
typename... Args>
361 constexpr static auto apply(F&& fun, Self&& self, Args&&... args)
362 BSONCXX_PRIVATE_RETURNS((
static_cast<Self&&
>(self).*fun)(
static_cast<Args&&
>(args)...));
366struct invoker<true, false> {
367 template <
typename F,
typename Self>
368 constexpr static auto apply(F&& fun, Self&& self) BSONCXX_PRIVATE_RETURNS(
static_cast<Self&&
>(self).*fun);
373static constexpr struct invoke_fn {
379 template <
typename F,
typename... Args,
typename Fd = remove_cvref_t<F>>
380 constexpr auto operator()(F&& fn, Args&&... args)
const
381 BSONCXX_PRIVATE_RETURNS(impl_invoke::invoker<
382 std::is_member_object_pointer<Fd>::value,
383 std::is_member_function_pointer<
384 Fd>::value>::apply(
static_cast<F&&
>(fn),
static_cast<Args&&
>(args)...));
392template <
typename F,
typename... Args>
393using invoke_result_t =
decltype(invoke(std::declval<F>(), std::declval<Args>()...));
399template <
typename F,
typename... Args>
400#if defined(_MSC_VER) && _MSC_VER < 1910
401using is_invocable = is_detected<invoke_result_t, F, Args...>;
403struct is_invocable : is_detected<invoke_result_t, F, Args...> {
409template <
typename T,
typename U>
410struct is_alike : std::is_same<remove_cvref_t<T>, remove_cvref_t<U>> {};
416template <std::
size_t N>
426namespace swap_detection {
432void swap(...) =
delete;
434template <
typename T,
typename U>
435auto is_swappable_f(rank<0>) -> std::false_type;
437template <
typename T,
typename U>
438auto is_swappable_f(rank<1>)
noexcept(
439 noexcept(swap(std::declval<T>(), std::declval<U>())) &&
noexcept(swap(std::declval<U>(), std::declval<T>())))
441 decltype(swap(std::declval<T>(), std::declval<U>())),
442 decltype(swap(std::declval<U>(), std::declval<T>()))>;
444template <
typename T,
typename U>
445auto is_nothrow_swappable_f(rank<0>) -> std::false_type;
447template <
typename T,
typename U>
448auto is_nothrow_swappable_f(rank<1>) -> bool_constant<
449 noexcept(swap(std::declval<T>(), std::declval<U>())) &&
noexcept(swap(std::declval<U>(), std::declval<T>()))>;
453template <
typename T,
typename U>
454struct is_swappable_with : decltype(swap_detection::is_swappable_f<T, U>(rank<1>{})) {};
456template <
typename T,
typename U>
457struct is_nothrow_swappable_with : decltype(swap_detection::is_nothrow_swappable_f<T, U>(rank<1>{})) {};
460struct is_swappable : is_swappable_with<T&, T&> {};
463struct is_nothrow_swappable : is_nothrow_swappable_with<T&, T&> {};
465template <
typename L,
typename R>
466auto is_equality_comparable_f(...) -> std::false_type;
468BSONCXX_PRIVATE_WARNINGS_PUSH();
469BSONCXX_PRIVATE_WARNINGS_DISABLE(GNU(
"-Wfloat-equal"));
470template <
typename L,
typename R>
471auto is_equality_comparable_f(
int,
bool b =
false)
473 decltype((std::declval<L const&>() == std::declval<R const&>()) ? 0 : 0, (std::declval<R const&>() == std::declval<L const&>()) ? 0 : 0, (std::declval<L const&>() != std::declval<R const&>()) ? 0 : 0, (std::declval<R const&>() != std::declval<L const&>()) ? 0 : 0)>;
474BSONCXX_PRIVATE_WARNINGS_POP();
479template <
typename L,
typename R = L>
480struct is_equality_comparable : decltype(is_equality_comparable_f<L, R>(0)) {};
482template <
typename L,
typename R>
483std::false_type is_partially_ordered_with_f(rank<0>);
485template <
typename L,
typename R>
486auto is_partially_ordered_with_f(rank<1>) -> true_t<
487 decltype(std::declval<L const&>() > std::declval<R const&>()),
488 decltype(std::declval<L const&>() < std::declval<R const&>()),
489 decltype(std::declval<L const&>() >= std::declval<R const&>()),
490 decltype(std::declval<L const&>() <= std::declval<R const&>()),
491 decltype(std::declval<R const&>() < std::declval<L const&>()),
492 decltype(std::declval<R const&>() > std::declval<L const&>()),
493 decltype(std::declval<R const&>() <= std::declval<L const&>()),
494 decltype(std::declval<R const&>() >= std::declval<L const&>())>;
496template <
typename T,
typename U>
497struct is_partially_ordered_with : decltype(is_partially_ordered_with_f<T, U>(rank<1>{})) {};
500struct is_totally_ordered : conjunction<is_equality_comparable<T>, is_partially_ordered_with<T, T>> {};
502template <
typename T,
typename U>
503struct is_totally_ordered_with : conjunction<
504 is_totally_ordered<T>,
505 is_totally_ordered<U>,
506 is_equality_comparable<T, U>,
507 is_partially_ordered_with<T, U>> {};
The bsoncxx v1 macro guard postlude header.
The bsoncxx v1 macro guard prelude header.
type
An enumeration of each BSON type.
Definition types.hpp:43
The top-level namespace within which all bsoncxx library entities are declared.