summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/hana/example/hash.cpp
blob: dcbdd7afa43c387fcc152c79d61910e77f94052b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Copyright Louis Dionne 2013-2017
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)

#include <boost/hana/assert.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/hash.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/type.hpp>

#include <type_traits>
#include <utility>
namespace hana = boost::hana;


// Sample implementation of a compile-time set data structure. Of course,
// this naive implementation only works when no two elements of the same
// set have the same hash.
template <typename T>
struct bucket { };

template <typename ...T>
struct set
    : bucket<typename decltype(hana::hash(std::declval<T>()))::type>...
{ };

template <typename Set, typename T>
struct contains
    : std::is_base_of<
        bucket<typename decltype(hana::hash(std::declval<T>()))::type>,
        Set
    >
{ };

using Set = set<hana::int_<1>, hana::ulong<2>, hana::type<char>>;

static_assert(contains<Set, hana::int_<1>>{}, "");
static_assert(contains<Set, hana::ulong<2>>{}, "");
static_assert(contains<Set, hana::type<char>>{}, "");

static_assert(!contains<Set, hana::int_<3>>{}, "");
static_assert(!contains<Set, hana::type<float>>{}, "");

int main() { }