mirror of
https://github.com/arun11299/cpp-jwt.git
synced 2025-05-15 01:08:31 +00:00
jwt_object design
This commit is contained in:
parent
81e6b2392e
commit
cb925fee3a
6 changed files with 372 additions and 0 deletions
|
@ -2,11 +2,15 @@
|
|||
#define CPP_JWT_META_HPP
|
||||
|
||||
#include <type_traits>
|
||||
#include "jwt/string_view.hpp"
|
||||
|
||||
namespace jwt {
|
||||
namespace detail {
|
||||
namespace meta {
|
||||
|
||||
/**
|
||||
* The famous void_t trick.
|
||||
*/
|
||||
template <typename... T>
|
||||
struct make_void
|
||||
{
|
||||
|
@ -16,7 +20,16 @@ struct make_void
|
|||
template <typename... T>
|
||||
using void_t = typename make_void<T...>::type;
|
||||
|
||||
/**
|
||||
* A type tag representing an empty tag.
|
||||
* To be used to represent a `result-not-found`
|
||||
* situation.
|
||||
*/
|
||||
struct empty_type {};
|
||||
|
||||
|
||||
/**
|
||||
*/
|
||||
template <typename T, typename=void>
|
||||
struct has_create_json_obj_member: std::false_type
|
||||
{
|
||||
|
@ -34,6 +47,91 @@ struct has_create_json_obj_member<T,
|
|||
{
|
||||
};
|
||||
|
||||
/**
|
||||
* 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 <typename T, typename=void>
|
||||
struct is_mapping_concept: std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct is_mapping_concept<T,
|
||||
void_t<
|
||||
typename std::enable_if<
|
||||
std::is_constructible<jwt::string_view, typename T::key_type>::value,
|
||||
void
|
||||
>::type,
|
||||
|
||||
typename std::enable_if<
|
||||
std::is_constructible<jwt::string_view, typename T::mapped_type>::value,
|
||||
void
|
||||
>::type,
|
||||
|
||||
decltype(
|
||||
std::declval<T&>().operator[](std::declval<const typename T::key_type&>()),
|
||||
std::declval<T&>().begin(),
|
||||
std::declval<T&>().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 <typename T, typename=void>
|
||||
struct is_parameter_concept: std::false_type
|
||||
{
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct is_parameter_concept<T,
|
||||
void_t<
|
||||
decltype(
|
||||
std::declval<T&>().get(),
|
||||
(void)0
|
||||
)
|
||||
>
|
||||
>: std::true_type
|
||||
{
|
||||
};
|
||||
|
||||
/**
|
||||
*/
|
||||
template <bool... V>
|
||||
struct bool_pack {};
|
||||
|
||||
/**
|
||||
*/
|
||||
template <bool... B>
|
||||
using all_true = std::is_same<bool_pack<true, B...>, bool_pack<B..., true>>;
|
||||
|
||||
/**
|
||||
*/
|
||||
template <typename... T>
|
||||
using are_all_params = all_true<is_parameter_concept<T>{}...>;
|
||||
|
||||
|
||||
} // END namespace meta
|
||||
} // END namespace detail
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue