forked from boostorg/hana
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hash.cpp
44 lines (34 loc) · 1.25 KB
/
hash.cpp
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() { }