1 #ifndef CACHEMERE_TRAITS_H
2 #define CACHEMERE_TRAITS_H
4 #include "cachemere/item.h"
6 namespace cachemere::detail::traits {
12 constexpr
auto has_reserve =
13 boost::hana::is_valid([](
auto& t) -> decltype(boost::hana::traits::declval(t).reserve(std::declval<size_t>())) {})(boost::hana::type_c<T>);
16 constexpr
auto has_size = boost::hana::is_valid([](
auto& t) -> decltype(boost::hana::traits::declval(t).size()) {})(boost::hana::type_c<T>);
18 template<
typename T,
typename... Args>
19 constexpr
auto has_emplace_back =
20 boost::hana::is_valid([](
auto& t) -> decltype(boost::hana::traits::declval(t).emplace_back(std::declval<Args>()...)) {})(boost::hana::type_c<T>);
27 template<
typename K,
typename KH,
typename V,
template<
class,
class,
class>
typename P>
28 constexpr
auto has_on_insert = boost::hana::is_valid(
29 [](
auto& policy_t,
auto& key_t,
auto& item_t) -> decltype(boost::hana::traits::declval(policy_t).on_insert(boost::hana::traits::declval(key_t),
30 boost::hana::traits::declval(item_t))) {
31 })(boost::hana::type_c<P<K, KH, V>>, boost::hana::type_c<K>, boost::hana::type_c<Item<V>>);
33 template<
typename K,
typename KH,
typename V,
template<
class,
class,
class>
typename P>
34 constexpr
auto has_on_update = boost::hana::is_valid(
35 [](
auto& policy_t,
auto& key_t,
auto& item_t) -> decltype(boost::hana::traits::declval(policy_t).on_update(boost::hana::traits::declval(key_t),
36 boost::hana::traits::declval(item_t),
37 boost::hana::traits::declval(item_t))) {
38 })(boost::hana::type_c<P<K, KH, V>>, boost::hana::type_c<K>, boost::hana::type_c<Item<V>>);
40 template<
typename K,
typename KH,
typename V,
template<
class,
class,
class>
typename P>
41 constexpr
auto has_on_cachehit = boost::hana::is_valid(
42 [](
auto& policy_t,
auto& key_t,
auto& item_t) -> decltype(boost::hana::traits::declval(policy_t).on_cache_hit(boost::hana::traits::declval(key_t),
43 boost::hana::traits::declval(item_t))) {
44 })(boost::hana::type_c<P<K, KH, V>>, boost::hana::type_c<K>, boost::hana::type_c<Item<V>>);
46 template<
typename K,
typename KH,
typename V,
template<
class,
class,
class>
typename P>
47 constexpr
auto has_on_cachemiss = boost::hana::is_valid(
48 [](
auto& policy_t,
auto& item_t) -> decltype(boost::hana::traits::declval(policy_t).on_cache_miss(boost::hana::traits::declval(item_t))) {
49 })(boost::hana::type_c<P<K, KH, V>>, boost::hana::type_c<K>);
51 template<
typename K,
typename KH,
typename V,
template<
class,
class,
class>
typename P>
52 constexpr
auto has_on_evict = boost::hana::is_valid(
53 [](
auto& policy_t,
auto& key_t,
auto& value_t) -> decltype(boost::hana::traits::declval(policy_t).on_evict(boost::hana::traits::declval(key_t),
54 boost::hana::traits::declval(value_t))) {
55 })(boost::hana::type_c<P<K, KH, V>>, boost::hana::type_c<K>, boost::hana::type_c<Item<V>>);