1
#ifndef CHILON_KEY_VALUE_HPP
2
#define CHILON_KEY_VALUE_HPP
3
4
#include <chilon/print.hpp>
5
6
#include <utility>
7
8
namespace chilon {
9
10
struct key_unique {};
11
struct key_merge  {};
12
// TODO: struct key_overwrite {};
13
14
template <class K, class V, class A = key_unique>
15
struct key_value : std::pair<K, V> {
16
    typedef std::pair<K, V>  base;
17
    typedef A                append_handler;
18
19
    key_value(key_value<K, V, A>&& rhs)      : base(std::move(rhs)) {}
20
    key_value(key_value<K, V, A> const& rhs) : base(rhs) {}
21
22
    template <class T, class U>
23
    key_value(T&& k, U&& v)
24
      : base(std::forward<T>(k), std::forward<U>(v)) {}
25
    key_value() {}
26
};
27
28
template <class A, class K, class V>
29
auto make_key_value(K&& k, V&& v) CHILON_RETURN(
30
    key_value<typename std::remove_reference<K>::type,
31
              typename std::remove_reference<V>::type, A>(std::forward<K>(k), std::forward<V>(v)))
32
33
template <class K, class V>
34
auto make_key_value(K&& k, V&& v) CHILON_RETURN(
35
    key_value<typename std::remove_reference<K>::type,
36
              typename std::remove_reference<V>::type>(std::forward<K>(k), std::forward<V>(v)))
37
38
template <class O, class U, class V, class A, class... T>
39
inline void print_args(int const indent, O&      stream,
40
                       key_value<U, V, A> const& head)
41
{
42
    print_args(indent, stream, head.first, ": ", head.second);
43
}
44
45
template <class T, class D = void>
46
struct get_key : meta::type_<D> {};
47
48
template <class K, class V, class A, class D>
49
struct get_key<key_value<K,V,A>, D> : meta::type_<K> {};
50
51
template <class T, class D = void>
52
struct get_value : meta::type_<D> {};
53
54
template <class K, class V, class A, class D>
55
struct get_value<key_value<K,V,A>, D> : meta::type_<V> {};
56
57
template <class T, class D = void>
58
struct get_appender : meta::type_<D> {};
59
60
template <class K, class V, class A, class D>
61
struct get_appender<key_value<K,V,A>, D> : meta::type_<A> {};
62
63
}
64
#endif