Fix type concept check. Remove refernce to get key_type et al

This commit is contained in:
Arun M 2017-11-23 17:56:38 +05:30
parent fc294cbc8a
commit 973e7e0249
4 changed files with 30 additions and 25 deletions

View file

@ -31,7 +31,7 @@ struct empty_type {};
/** /**
*/ */
template <typename T, typename=void> template <typename T, typename=void>
struct has_create_json_obj_member: std::false_type struct has_create_json_obj_member
{ {
}; };
@ -72,22 +72,21 @@ template <typename T>
struct is_mapping_concept<T, struct is_mapping_concept<T,
void_t< void_t<
typename std::enable_if< typename std::enable_if<
std::is_constructible<jwt::string_view, typename T::key_type>::value, std::is_constructible<jwt::string_view, typename std::remove_reference_t<T>::key_type>::value,
void void
>::type, >::type,
typename std::enable_if< typename std::enable_if<
std::is_constructible<jwt::string_view, typename T::mapped_type>::value, std::is_constructible<jwt::string_view, typename std::remove_reference_t<T>::mapped_type>::value,
void void
>::type, >::type,
decltype( decltype(
std::declval<T&>().operator[](std::declval<const typename T::key_type&>()), std::declval<T&>().operator[](std::declval<typename std::remove_reference_t<T>::key_type>()),
std::declval<T&>().begin(), std::declval<T&>().begin(),
std::declval<T&>().end(), std::declval<T&>().end(),
(void)0 (void)0
) )
> >
>: std::true_type >: std::true_type
{ {

View file

@ -107,16 +107,6 @@ struct headers_param
using param_init_list_t = std::initializer_list<std::pair<jwt::string_view, jwt::string_view>>; using param_init_list_t = std::initializer_list<std::pair<jwt::string_view, jwt::string_view>>;
/**
*/
template <typename MappingConcept,
typename=typename jwt::detail::meta::is_mapping_concept<MappingConcept>::type>
detail::payload_param<MappingConcept>
payload(MappingConcept&& mc)
{
return { std::forward<MappingConcept>(mc) };
}
/** /**
*/ */
detail::payload_param<std::unordered_map<std::string, std::string>> detail::payload_param<std::unordered_map<std::string, std::string>>
@ -131,6 +121,18 @@ payload(const param_init_list_t& kvs)
return { std::move(m) }; return { std::move(m) };
} }
/**
*/
template <typename MappingConcept>
detail::payload_param<MappingConcept>
payload(MappingConcept&& mc)
{
static_assert (jwt::detail::meta::is_mapping_concept<MappingConcept>::value,
"Template parameter does not meet the requirements for MappingConcept.");
return { std::forward<MappingConcept>(mc) };
}
/** /**
*/ */
@ -153,16 +155,6 @@ detail::algorithm_param algorithm(jwt::algorithm alg)
return { alg }; return { alg };
} }
/**
*/
template <typename MappingConcept,
typename=typename jwt::detail::meta::is_mapping_concept<MappingConcept>::type>
detail::headers_param<MappingConcept>
headers(MappingConcept&& mc)
{
return { std::forward<MappingConcept>(mc) };
}
/** /**
*/ */
detail::headers_param<std::map<std::string, std::string>> detail::headers_param<std::map<std::string, std::string>>
@ -177,6 +169,18 @@ headers(const param_init_list_t& kvs)
return { std::move(m) }; return { std::move(m) };
} }
/**
*/
template <typename MappingConcept>
detail::headers_param<MappingConcept>
headers(MappingConcept&& mc)
{
static_assert (jwt::detail::meta::is_mapping_concept<MappingConcept>::value,
"Template parameter does not meet the requirements for MappingConcept.");
return { std::forward<MappingConcept>(mc) };
}
} // END namespace params } // END namespace params
} // END namespace jwt } // END namespace jwt

Binary file not shown.

View file

@ -11,12 +11,14 @@ void basic_jwt_object_test()
{"a", "b"}, {"a", "b"},
{"c", "d"} {"c", "d"}
})); }));
//check with std::map //check with std::map
std::map<std::string, std::string> m; std::map<std::string, std::string> m;
m["a"] = "b"; m["a"] = "b";
m["c"] = "d"; m["c"] = "d";
jwt::jwt_object obj1{payload(m)}; jwt::jwt_object obj1{payload(m)};
auto obj2 = std::move(obj1); auto obj2 = std::move(obj1);
std::cout << obj2.payload() << std::endl; std::cout << obj2.payload() << std::endl;