32#ifndef MADNESS_WORLD_TYPE_TRAITS_H__INCLUDED
33#define MADNESS_WORLD_TYPE_TRAITS_H__INCLUDED
61 template <
typename Archive,
typename T,
typename Enabler =
void>
62 struct ArchiveSerializeImpl;
64 template <
class Archive,
class T,
typename Enabler =
void>
65 struct ArchiveLoadImpl;
67 template <
class Archive,
class T,
typename Enabler =
void>
68 struct ArchiveStoreImpl;
70 template <
class Archive,
class T,
typename Enabler =
void>
74 template <
typename>
class Future;
108 template <
typename T>
122 template <
typename T>
130 template <
typename T>
138 template <
typename T>
146 template <
typename T>
154 template <
typename T>
163 #define REMFUTURE(T) typename remove_future< T >::type
166 template <
typename T>
172 template <
typename T>
176 template <
typename T>
180 template <
typename T>
184 template <
typename T>
188 template <
typename T>
192 template <
typename T>
197 template <
typename T>
202 template <
typename T>
207 template <
typename T>
struct is_function_pointer<
T,
std::enable_if_t<std::is_function<typename std::remove_pointer<T>::type>::value>> :
public std::true_type {};
214 template <
typename T>
struct is_any_function_pointer<
T,
std::enable_if_t<std::is_member_function_pointer<T>::value || is_function_pointer_v<T>>> :
public std::true_type {};
218 template <
typename T>
221 template <
typename T>
227 template <
typename T>
230 std::is_arithmetic<T>::value || \
231 std::is_function<T>::value || \
232 is_any_function_pointer_v<T> || \
233 (std::is_standard_layout<T>::value && std::is_trivial<T>::value && !std::is_pointer<T>::value);
237 template <
typename T>
241 namespace is_ostreammable_ns {
243 template <
typename To,
typename From>
using left_shift =
decltype(std::declval<To>() << std::declval<From>());
246 template <
typename T>
struct impl :
public meta::disjunction<meta::is_detected_exact<std::ostream&, left_shift, std::ostream&, std::add_const_t<std::add_lvalue_reference_t<T>>>,
247 meta::is_detected_exact<std::ostream&, left_shift_in_ns_madness_operators, std::ostream&, std::add_const_t<std::add_lvalue_reference_t<T>>>> {};
252 template <
typename T>
259 namespace is_istreammable_ns {
261 template <
typename From,
typename To>
using right_shift =
decltype(std::declval<From>() >> std::declval<To>());
264 template <
typename T>
struct impl :
public meta::disjunction<meta::is_detected_exact<std::istream&, right_shift, std::istream&, std::add_lvalue_reference_t<T>>,
265 meta::is_detected_exact<std::istream&, right_shift_in_ns_madness_operators, std::istream&, std::add_lvalue_reference_t<T>>> {};
271 template <
typename T>
278 template <
typename T>
constexpr bool is_iostreammable_v = is_istreammable_v<T> && is_ostreammable_v<T>;
281 std::is_arithmetic<T>::value || \
282 std::is_same<std::nullptr_t, typename std::remove_cv<T>::type>::value || \
283 is_any_function_pointer_v<T> || \
284 std::is_function<T>::value;
289 template<
typename T,
typename Archive>
295 template<
typename T,
typename Archive>
300 template<
typename T,
typename Archive>
305 template<
typename T,
typename Archive>
310 template<
typename T,
typename Archive>
315 template<
typename T,
typename Archive>
320 template<
typename T,
typename Archive>
325 template<
typename T,
typename Archive>
330 template<
typename T,
typename Archive,
typename = std::enable_if_t<std::is_po
inter_v<T>>>
335 template<
typename T,
typename Archive,
typename = std::enable_if_t<!std::is_po
inter_v<T>>>
340 template<
typename T,
typename Archive>
345 template<
typename T,
typename Archive,
typename = std::enable_if_t<std::is_po
inter_v<T>>>
353 template <
typename T,
typename Archive>
361 template <
typename T,
typename Archive>
369 template <
typename T,
typename Archive>
377 template <
typename T,
typename Archive>
378 inline constexpr bool has_nonmember_load_v = madness::meta::is_detected_v<madness::has_nonmember_load_t,T,Archive>;
385 template <
typename T,
typename Archive>
386 inline constexpr bool has_nonmember_store_v = madness::meta::is_detected_v<madness::has_nonmember_store_t,T,Archive>;
388 template <
typename T,
typename Archive>
396 template <
typename T,
typename Archive>
404 template <
typename T,
typename Archive>
407 template <
typename T,
typename Archive>
415 template <
typename T,
typename Archive>
423 template <
typename T,
typename Archive>
431 template <
typename T,
typename Archive>
439 template <
typename T,
typename Archive>
447 template <
typename T,
typename Archive>
450 template <
typename Archive,
typename T,
typename Enabler =
void>
460 template <
typename Archive,
typename T>
465 template <
typename Archive,
typename T>
468 template <
typename Archive,
typename T>
474 class BaseInputArchive;
475 class BaseOutputArchive;
476 class BinaryFstreamOutputArchive;
477 class BinaryFstreamInputArchive;
478 class BufferOutputArchive;
479 class BufferInputArchive;
480 class VectorOutputArchive;
481 class VectorInputArchive;
482 class TextFstreamOutputArchive;
483 class TextFstreamInputArchive;
484 class MPIRawOutputArchive;
485 class MPIRawInputArchive;
486 class MPIOutputArchive;
487 class MPIInputArchive;
488 class ContainerRecordInputArchive;
489 class ContainerRecordOutputArchive;
490 template <
class localarchiveT>
491 class ParallelOutputArchive;
492 template <
class localarchiveT>
493 class ParallelInputArchive;
494 template <
typename T>
505 template <
typename T,
typename Enabler =
void>
508 template <
typename T>
511 template <
typename T>
512 inline constexpr bool is_archive_v = meta::is_detected_v<is_archive_defined_t,T>;
522 template <
typename T,
typename Enabler =
void>
525 template <
typename T>
528 template <
typename T>
538 template <
typename T,
typename Enabler =
void>
541 template <
typename T>
544 template <
typename T>
547 template <
typename T>
549 template <
typename T>
551 template <
typename T>
553 template <
typename T>
555 template <
typename T>
557 template <
typename T>
561 template <
typename T>
562 struct is_default_serializable_helper<archive::TextFstreamOutputArchive,
T, std::enable_if_t<is_iostreammable_v<T> || std::is_function_v<T> || is_any_function_pointer_v<T>>> : std::true_type {};
563 template <
typename T>
564 struct is_default_serializable_helper<archive::TextFstreamInputArchive,
T, std::enable_if_t<is_iostreammable_v<T> || is_any_function_pointer_v<T>>> : std::true_type {};
565 template <
typename T>
567 template <
typename T>
569 template <
typename T>
571 template <
typename T>
573 template <
typename T>
575 template <
typename T>
577 template <
typename T,
class localarchiveT>
579 template <
typename T,
class localarchiveT>
581 template <
typename Archive,
typename T>
582 struct is_default_serializable_helper<Archive, archive::archive_array<T>, std::enable_if_t<is_default_serializable_helper<Archive,T>::value>> : std::true_type {};
585 struct is_archive<archive::BinaryFstreamOutputArchive> : std::true_type {};
587 struct is_archive<archive::BinaryFstreamInputArchive> : std::true_type {};
589 struct is_archive<archive::BufferOutputArchive> : std::true_type {};
591 struct is_archive<archive::BufferInputArchive> : std::true_type {};
593 struct is_archive<archive::VectorOutputArchive> : std::true_type {};
595 struct is_archive<archive::VectorInputArchive> : std::true_type {};
597 struct is_archive<archive::TextFstreamOutputArchive> : std::true_type {};
599 struct is_archive<archive::TextFstreamInputArchive> : std::true_type {};
601 struct is_archive<archive::MPIRawOutputArchive> : std::true_type {};
603 struct is_archive<archive::MPIRawInputArchive> : std::true_type {};
605 struct is_archive<archive::MPIOutputArchive> : std::true_type {};
607 struct is_archive<archive::MPIInputArchive> : std::true_type {};
609 struct is_archive<archive::ContainerRecordOutputArchive> : std::true_type {};
611 struct is_archive<archive::ContainerRecordInputArchive> : std::true_type {};
612 template <
class localarchiveT>
613 struct is_archive<archive::ParallelOutputArchive<localarchiveT> > : std::true_type {};
614 template <
class localarchiveT>
615 struct is_archive<archive::ParallelInputArchive<localarchiveT> > : std::true_type {};
631 template <
class localarchiveT>
648 template <
class localarchiveT>
649 struct is_input_archive<archive::ParallelInputArchive<localarchiveT> > : std::true_type {};
654 template <
typename Archive,
typename T>
656 has_nonmember_serialize_v<T, Archive> ||
657 ((has_nonmember_load_v<T, Archive> || has_nonmember_wrap_load_v<T, Archive>) && is_input_archive_v<Archive> && !has_freestanding_default_serialize_v<T, Archive>) ||
658 ((has_nonmember_store_v<T, Archive> || has_nonmember_wrap_store_v<T, Archive>) && is_output_archive_v<Archive> && !has_freestanding_default_serialize_v<T, Archive>));
660 template <
typename Archive,
typename T>
668 template <
typename Archive,
typename T>
669 inline constexpr bool is_serializable_v = is_archive_v<Archive> && (is_default_serializable_v<Archive, T> ||
670 is_user_serializable_v<Archive,T>);
672 template <
typename Archive,
typename T>
675 template <
typename Archive,
typename T>
681 template <
typename Archive,
typename Enabler =
void>
691 template <
typename Archive>
717 template<
template<
typename, std::
size_t>
class Functor,
typename T, std::size_t... Is,
typename... FunctorArgs,
typename... CallArgs>
718 auto loop_N(std::index_sequence<Is...>, std::tuple<FunctorArgs...>&& functor_args, CallArgs&&... call_args)
719 -> std::array<decltype(Functor<T, 1>(std::forward<FunctorArgs>(std::get<FunctorArgs>(functor_args))...)(std::forward<CallArgs>(call_args)...)),
sizeof...(Is)>
721 return { Functor<T, Is + 1>(std::forward<FunctorArgs>(std::get<FunctorArgs>(functor_args))...)(std::forward<CallArgs>(call_args)...)... };
724 template<
template<
typename, std::
size_t>
class Functor,
typename... Ts,
typename... FunctorArgs,
typename... CallArgs>
725 auto loop_types(std::tuple<FunctorArgs...>&& functor_args, CallArgs&&... call_args)
727 return std::make_tuple(loop_N<Functor, Ts>(std::make_index_sequence<6>{}, std::move(functor_args), std::forward<CallArgs>(call_args)...)...);
731 template<
typename tupleT,
typename opT, std::
size_t I=0>
733 if constexpr(I < std::tuple_size_v<tupleT>) {
734 auto& element1=std::get<I>(tuple);
736 unary_tuple_loop<tupleT,opT, I+1>(tuple,
op);
741 template<
typename tupleT,
typename tupleR,
typename opT, std::
size_t I=0>
743 if constexpr(I < std::tuple_size_v<tupleT>) {
744 auto& element1=std::get<I>(tuple1);
745 auto& element2=std::get<I>(tuple2);
746 op(element1,element2);
747 binary_tuple_loop<tupleT, tupleR, opT, I+1>(tuple1,tuple2,
op);
754 template<
typename T, std::
size_t NDIM>
class Function;
757 template<
typename T, std::
size_t NDIM>
772#define REMCONST(TYPE) typename std::remove_const< TYPE >::type
773#define MEMFUN_RETURNT(MEMFUN) typename madness::detail::memfunc_traits< MEMFUN >::result_type
A future is a possibly yet unevaluated value.
Definition future.h:369
Definition type_traits.h:54
auto T(World &world, response_space &f) -> response_space
Definition global_functions.cc:28
static double u(double r, double c)
Definition he.cc:20
Tensor< double > op(const Tensor< double > &x)
Definition kain.cc:508
decltype(madness::operators::operator<<(std::declval< From >(), std::declval< To >())) right_shift_in_ns_madness_operators
Definition type_traits.h:262
decltype(std::declval< From >() > > std::declval< To >()) right_shift
Definition type_traits.h:261
decltype(madness::operators::operator<<(std::declval< To >(), std::declval< From >())) left_shift_in_ns_madness_operators
Definition type_traits.h:244
decltype(std::declval< To >()<< std::declval< From >()) left_shift
Definition type_traits.h:243
std::ostream & operator<<(std::ostream &s, const std::array< T, N > &a)
Output std::array to stream for human consumption.
Definition array_addons.h:59
std::ostream & operator>>(std::ostream &, __x &)
Namespace for all elements and tools of MADNESS.
Definition DFParameters.h:10
constexpr bool has_nonmember_load_and_store_v
Definition type_traits.h:389
typename future_to_ref< T >::type future_to_ref_t
Definition type_traits.h:193
auto loop_types(std::tuple< FunctorArgs... > &&functor_args, CallArgs &&... call_args)
Definition type_traits.h:725
constexpr bool is_serializable_v
Definition type_traits.h:669
typename remove_fcvr< T >::type remove_fcvr_t
Definition type_traits.h:203
constexpr bool is_always_serializable
Definition type_traits.h:280
decltype(madness::archive::ArchiveImpl< Archive, T >::wrap_load(std::declval< Archive & >(), std::declval< T & >())) has_nonmember_wrap_load_t
Definition type_traits.h:316
decltype(std::declval< T & >().serialize(std::declval< Archive & >())) has_member_serialize_t
Definition type_traits.h:290
constexpr bool is_function_pointer_v
Definition type_traits.h:208
constexpr bool is_istreammable_v
Shortcut for is_istreammable<T>::value.
Definition type_traits.h:275
decltype(serialize(std::declval< Archive & >(), std::declval< T & >(), 1u)) has_freestanding_serialize_with_size_t
Definition type_traits.h:331
constexpr bool has_nonmember_wrap_load_v
Definition type_traits.h:397
decltype(serialize(std::declval< Archive & >(), std::declval< T & >())) has_freestanding_serialize_t
Definition type_traits.h:326
constexpr bool is_default_serializable_v< Archive, const T >
Definition type_traits.h:469
constexpr bool is_user_serializable_v< Archive, const T >
Definition type_traits.h:661
constexpr bool has_member_serialize_v
Definition type_traits.h:354
constexpr bool has_freestanding_serialize_with_size_v
Definition type_traits.h:424
constexpr bool has_nonmember_wrap_load_and_store_v
Definition type_traits.h:408
decltype(default_serialize(std::declval< Archive & >(), std::declval< const T & >(), 1u)) has_freestanding_default_serialize_with_size_t
Definition type_traits.h:346
constexpr bool has_freestanding_serialize_with_version_v
Definition type_traits.h:432
constexpr bool has_freestanding_serialize_v
Definition type_traits.h:416
decltype(madness::archive::ArchiveSerializeImpl< Archive, T >::serialize(std::declval< Archive & >(), std::declval< T & >())) has_nonmember_serialize_t
Definition type_traits.h:301
constexpr bool is_iostreammable_v
providing automatic support for serializing to/from std streams requires bidirectional streammability
Definition type_traits.h:278
constexpr bool is_user_serializable_v
Definition type_traits.h:655
typename is_input_archive< std::remove_reference_t< std::remove_cv_t< T > > >::type is_input_archive_defined_t
Definition type_traits.h:526
decltype(madness::archive::ArchiveLoadImpl< Archive, T >::load(std::declval< Archive & >(), std::declval< T & >())) has_nonmember_load_t
Definition type_traits.h:306
constexpr bool is_ostreammable_v
Shortcut for is_ostreammable<T>::value.
Definition type_traits.h:256
typename is_archive< std::remove_reference_t< std::remove_cv_t< T > > >::type is_archive_defined_t
Definition type_traits.h:509
typename is_output_archive< std::remove_reference_t< std::remove_cv_t< T > > >::type is_output_archive_defined_t
Definition type_traits.h:542
constexpr bool is_default_serializable_v
Definition type_traits.h:466
static void binary_tuple_loop(tupleT &tuple1, tupleR &tuple2, opT &op)
loop over the tuple elements of both tuples and execute the operation op on each element pair
Definition type_traits.h:742
decltype(default_serialize(std::declval< Archive & >(), std::declval< T & >())) has_freestanding_default_serialize_t
Definition type_traits.h:341
constexpr bool is_output_archive_v
Definition type_traits.h:545
static void unary_tuple_loop(tupleT &tuple, opT &op)
loop over a tuple and apply unary operator op to each element
Definition type_traits.h:732
constexpr bool has_nonmember_wrap_store_v
Definition type_traits.h:405
constexpr bool has_freestanding_default_serialize_v
Definition type_traits.h:440
auto loop_N(std::index_sequence< Is... >, std::tuple< FunctorArgs... > &&functor_args, CallArgs &&... call_args) -> std::array< decltype(Functor< T, 1 >(std::forward< FunctorArgs >(std::get< FunctorArgs >(functor_args))...)(std::forward< CallArgs >(call_args)...)), sizeof...(Is)>
Definition type_traits.h:718
constexpr bool is_any_function_pointer_v
Definition type_traits.h:215
decltype(serialize(std::declval< Archive & >(), std::declval< T & >(), 0u)) has_freestanding_serialize_with_version_t
Definition type_traits.h:336
constexpr bool is_input_archive_v
Definition type_traits.h:529
constexpr bool has_member_serialize_with_version_v
Definition type_traits.h:362
std::string type(const PairType &n)
Definition PNOParameters.h:18
decltype(madness::archive::ArchiveStoreImpl< Archive, T >::store(std::declval< Archive & >(), std::declval< T & >())) has_nonmember_store_t
Definition type_traits.h:311
constexpr bool has_nonmember_serialize_v
Definition type_traits.h:370
decltype(std::declval< T & >().serialize(std::declval< Archive & >(), 0u)) has_member_serialize_with_version_t
Definition type_traits.h:296
constexpr bool is_serializable_v< Archive, const T >
Definition type_traits.h:673
constexpr bool has_nonmember_store_v
Definition type_traits.h:386
constexpr bool is_archive_v
Definition type_traits.h:512
constexpr const bool is_text_archive_v
is_text_archive_v is a shorthand for is_text_archive<A>::value
Definition type_traits.h:692
decltype(madness::archive::ArchiveImpl< Archive, T >::wrap_store(std::declval< Archive & >(), std::declval< T & >())) has_nonmember_wrap_store_t
Definition type_traits.h:321
constexpr bool has_nonmember_load_v
Definition type_traits.h:378
typename remove_future< T >::type remove_future_t
C++11 version of REMFUTURE.
Definition type_traits.h:167
constexpr bool is_trivially_copyable_v
Definition type_traits.h:222
constexpr bool has_freestanding_default_serialize_with_size_v
Definition type_traits.h:448
constexpr bool is_trivially_serializable_v
Definition type_traits.h:238
Future< T > type
Type with Future added.
Definition type_traits.h:102
maps type T to Future<T>.
Definition type_traits.h:89
Future< T > type
Type with Future added.
Definition type_traits.h:91
static const Archive & wrap_load(const Archive &ar, const T &t)
Load an object sandwiched between its preamble and postamble.
Definition archive.h:748
static const Archive & wrap_store(const Archive &ar, const T &t)
Store an object sandwiched between its preamble and postamble.
Definition archive.h:734
static void load(const A &ar, const U &t)
Load an object.
Definition archive.h:679
static void serialize(const Archive &ar, T &t)
Serializes the type.
Definition archive.h:561
static std::enable_if_t< is_output_archive_v< A > &&!std::is_function< U >::value &&(has_member_serialize_v< U, A >||has_nonmember_serialize_v< U, A >||has_freestanding_serialize_v< U, A >||has_freestanding_default_serialize_v< U, A >), void > store(const A &ar, const U &t)
Definition archive.h:622
T & type
Definition type_traits.h:178
T & type
Definition type_traits.h:182
T & type
Definition type_traits.h:186
T & type
Definition type_traits.h:190
Definition type_traits.h:173
T type
Definition type_traits.h:174
is true type if T is a pointer to free or member function
Definition type_traits.h:213
Checks if T is an archive type.
Definition type_traits.h:506
Definition type_traits.h:451
is std::true_type if T can be serialized to Archive without specialized serialize() method
Definition type_traits.h:461
static constexpr bool value
Definition type_traits.h:462
is true type if T is a pointer to a free function
Definition type_traits.h:206
test if a type is a future.
Definition type_traits.h:80
Definition type_traits.h:265
Definition type_traits.h:272
Definition type_traits.h:756
Definition type_traits.h:247
Definition type_traits.h:253
Checks if T is an output archive type.
Definition type_traits.h:539
Definition type_traits.h:676
This trait types tests if Archive is a text archive.
Definition type_traits.h:682
trait for trivial (=bitwise) copyability of T, defaults to std::is_trivially_copyable<T> but can be s...
Definition type_traits.h:219
Definition type_traits.h:228
static const bool value
Definition type_traits.h:229
Definition type_traits.h:198
remove_future< typenamestd::remove_cv< typenamestd::remove_reference< T >::type >::type >::type type
Definition type_traits.h:200
T type
Type with Future removed.
Definition type_traits.h:125
T & type
Type with Future removed.
Definition type_traits.h:141
T && type
Type with Future removed.
Definition type_traits.h:149
const T type
Type with Future removed.
Definition type_traits.h:133
const T & type
Type with Future removed.
Definition type_traits.h:157
maps Future<T> to T.
Definition type_traits.h:109
T type
Type with Future removed.
Definition type_traits.h:111