#ifndef CPP_JWT_META_HPP #define CPP_JWT_META_HPP #include #include #include "jwt/string_view.hpp" namespace jwt { namespace detail { namespace meta { /** * The famous void_t trick. */ template struct make_void { using type = void; }; template using void_t = typename make_void::type; /** * A type tag representing an empty tag. * To be used to represent a `result-not-found` * situation. */ struct empty_type {}; /** * A type list. */ template struct list{}; /** */ template struct has_create_json_obj_member { }; template struct has_create_json_obj_member().create_json_obj(), (void)0 ) > >: std::true_type { }; /** * Checks if the type `T` models MappingConcept. * * Requirements on type `T` for matching the requirements: * a. Must be able to construct jwt::string_view from the * `key_type` of the map. * b. Must be able to construct jwt::string_view from the * `mapped_type` of the map. * c. The type `T` must have an access operator i.e. operator[]. * d. The type `T` must have `begin` and `end` member functions * for iteration. * * NOTE: Requirements `a` and `b` means that the concept * type can only hold values that are string or constructible * to form a string_view (basically C strings and std::string) */ template struct is_mapping_concept: std::false_type { }; template struct is_mapping_concept::key_type>::value, void >::type, typename std::enable_if< std::is_constructible::mapped_type>::value, void >::type, decltype( std::declval().operator[](std::declval::key_type>()), std::declval().begin(), std::declval().end(), (void)0 ) > >: std::true_type { }; /** * Checks if the type `T` models the ParameterConcept. * * Requirements on type `T` for matching the requirements: * a. The type must have a `get` method. */ template struct is_parameter_concept: std::false_type { }; template struct is_parameter_concept().get(), (void)0 ) > >: std::true_type { }; /** */ template struct is_sequence_concept: std::false_type { }; /// For array types template struct is_sequence_concept>::value>, std::enable_if_t< std::is_constructible()))>>::value > > >: std::true_type { }; template struct is_sequence_concept::iterator::iterator_category >::value>, std::enable_if_t< std::is_constructible::value_type>::value >, decltype( std::declval().begin(), std::declval().end(), (void)0 ) > >: std::true_type { }; /** * Find if a type is present in the typelist. * Eg: has_type>{} == true * has_type>{} == false */ template struct has_type; template struct has_type>: std::false_type { }; template struct has_type>: std::true_type { }; template struct has_type>: has_type> { }; /** * A pack of bools for the bool trick. */ template struct bool_pack {}; /** */ template using all_true = std::is_same, bool_pack>; /** */ template using are_all_params = all_true{}...>; } // END namespace meta } // END namespace detail } // END namespace jwt #endif