#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace tf { // ---------------------------------------------------------------------------- // Supported C++ STL type // ---------------------------------------------------------------------------- // std::basic_string template struct is_std_basic_string : std::false_type {}; template struct is_std_basic_string > : std::true_type {}; template constexpr bool is_std_basic_string_v = is_std_basic_string::value; // std::array template struct is_std_array : std::false_type {}; template struct is_std_array > : std::true_type {}; template constexpr bool is_std_array_v = is_std_array::value; // std::vector template struct is_std_vector : std::false_type {}; template struct is_std_vector > : std::true_type {}; template constexpr bool is_std_vector_v = is_std_vector::value; // std::deque template struct is_std_deque : std::false_type {}; template struct is_std_deque > : std::true_type {}; template constexpr bool is_std_deque_v = is_std_deque::value; // std::list template struct is_std_list : std::false_type {}; template struct is_std_list > : std::true_type {}; template constexpr bool is_std_list_v = is_std_list::value; // std::forward_list template struct is_std_forward_list : std::false_type {}; template struct is_std_forward_list > : std::true_type {}; template constexpr bool is_std_forward_list_v = is_std_forward_list::value; // std::map template struct is_std_map : std::false_type {}; template struct is_std_map > : std::true_type {}; template constexpr bool is_std_map_v = is_std_map::value; // std::unordered_map template struct is_std_unordered_map : std::false_type {}; template struct is_std_unordered_map > : std::true_type {}; template constexpr bool is_std_unordered_map_v = is_std_unordered_map::value; // std::set template struct is_std_set : std::false_type {}; template struct is_std_set > : std::true_type {}; template constexpr bool is_std_set_v = is_std_set::value; // std::unordered_set template struct is_std_unordered_set : std::false_type {}; template struct is_std_unordered_set > : std::true_type {}; template constexpr bool is_std_unordered_set_v = is_std_unordered_set::value; // std::variant template struct is_std_variant : std::false_type {}; template struct is_std_variant > : std::true_type {}; template constexpr bool is_std_variant_v = is_std_variant::value; // std::optional template struct is_std_optional : std::false_type {}; template struct is_std_optional > : std::true_type {}; template constexpr bool is_std_optional_v = is_std_optional::value; // std::unique_ptr template struct is_std_unique_ptr : std::false_type {}; template struct is_std_unique_ptr > : std::true_type {}; template constexpr bool is_std_unique_ptr_v = is_std_unique_ptr::value; // std::shared_ptr template struct is_std_shared_ptr : std::false_type {}; template struct is_std_shared_ptr > : std::true_type {}; template constexpr bool is_std_shared_ptr_v = is_std_shared_ptr::value; // std::duration template struct is_std_duration : std::false_type {}; template struct is_std_duration> : std::true_type {}; template constexpr bool is_std_duration_v = is_std_duration::value; // std::time_point template struct is_std_time_point : std::false_type {}; template struct is_std_time_point> : std::true_type {}; template constexpr bool is_std_time_point_v = is_std_time_point::value; // std::tuple template struct is_std_tuple : std::false_type {}; template struct is_std_tuple> : std::true_type {}; template constexpr bool is_std_tuple_v = is_std_tuple::value; //----------------------------------------------------------------------------- // Type extraction. //----------------------------------------------------------------------------- // ExtractType: forward declaration template struct ExtractType; // ExtractType_t: alias interface template using ExtractType_t = typename ExtractType::type; // ExtractType: base template