Cachemere
Modular Caching Library for C++
traits.h
1 #ifndef CACHEMERE_TRAITS_H
2 #define CACHEMERE_TRAITS_H
3 
4 #include "cachemere/item.h"
5 
6 namespace cachemere::detail::traits {
7 
8 // Traits for STL types.
9 namespace stl {
10 
11 template<typename T>
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>);
14 
15 template<typename T>
16 constexpr auto has_size = boost::hana::is_valid([](auto& t) -> decltype(boost::hana::traits::declval(t).size()) {})(boost::hana::type_c<T>);
17 
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>);
21 
22 } // namespace stl
23 
24 // Traits for cache event handlers.
25 namespace event {
26 
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>>);
32 
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>>);
39 
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>>);
45 
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>);
50 
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>>);
56 
57 } // namespace event
58 
59 } // namespace cachemere::detail::traits
60 
61 #endif