Skip to content

Commit fc071b4

Browse files
committed
Added Tags, which is unused for now.
1 parent fdc39d7 commit fc071b4

File tree

3 files changed

+189
-0
lines changed

3 files changed

+189
-0
lines changed

utility/tags.hpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
#pragma once
2+
3+
#include "tmp_util/control/if.hpp"
4+
#include "tmp_util/functional/lift.hpp"
5+
6+
namespace JSON
7+
{
8+
template <typename... Tags>
9+
struct Tag
10+
{
11+
using json_tags = Tag<Tags...>;
12+
};
13+
14+
struct RootObject;
15+
16+
template <typename...>
17+
struct always_false
18+
{
19+
static constexpr const bool value = false;
20+
using type = false_;
21+
};
22+
23+
template <typename...>
24+
struct always_true
25+
{
26+
static constexpr const bool value = true;
27+
using type = true_;
28+
};
29+
30+
template<typename T>
31+
struct void_ { typedef void type; };
32+
33+
template <typename Obj, typename Tag, typename = void>
34+
struct contains_any_tag
35+
{
36+
static constexpr const bool value = false;
37+
using vt = false_;
38+
using type = void;
39+
};
40+
41+
template <typename Obj, typename Tag>
42+
struct contains_any_tag <Obj, Tag, typename void_<typename Obj::json_tags>::type>
43+
{
44+
static constexpr const bool value = true;
45+
using vt = true_;
46+
using type = typename Obj::json_tags;
47+
};
48+
49+
template <typename T>
50+
struct identity : public T {};
51+
52+
template <typename What, typename T, typename... List>
53+
struct find
54+
{
55+
using lifted = lift <find>;
56+
using true_lift = lift <always_true>;
57+
using type = lazy_if_t<
58+
bool_ <std::is_same <What, T>::value>,
59+
then_ <true_lift>,
60+
else_ <lifted, What, List...>
61+
>;
62+
};
63+
64+
template <typename What, typename T>
65+
struct find <What, T>
66+
{
67+
using true_lift = lift <always_true>;
68+
using false_lift = lift <always_false>;
69+
using type = lazy_if_t <
70+
bool_ <std::is_same <What, T>::value>,
71+
then_ <true_lift>,
72+
else_ <false_lift>
73+
>;
74+
};
75+
76+
template <typename What, typename Obj>
77+
struct contains_tag_impl
78+
{
79+
using type = lift <always_false>;
80+
};
81+
82+
template <typename What, typename... List>
83+
struct contains_tag_impl <What, Tag <List...>>
84+
{
85+
using type = typename find <What, List...>::type;
86+
};
87+
88+
template <typename Obj, typename What>
89+
struct contains_tag
90+
{
91+
using tag_check = contains_any_tag <Obj, What>;
92+
93+
using impl_lift = lift <contains_tag_impl>;
94+
using false_lift = lift <always_false>;
95+
96+
using type = lazy_if_t <
97+
typename tag_check::vt,
98+
then_ <impl_lift, What, typename tag_check::type>,
99+
else_ <false_lift>
100+
>;
101+
102+
constexpr static const bool value = type::template apply<>::value;
103+
};
104+
}

utility/tmp_util/control/if.hpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#pragma once
2+
3+
#include "../fundamental/eval_if.hpp"
4+
#include "../fundamental/integral.hpp"
5+
6+
namespace JSON
7+
{
8+
template <typename Condition,
9+
typename TrueT,
10+
typename FalseT>
11+
struct if_ {
12+
using type = TrueT;
13+
};
14+
15+
template <typename TrueT,
16+
typename FalseT>
17+
struct if_ <bool_ <false>, TrueT, FalseT> {
18+
using type = FalseT;
19+
};
20+
21+
template <typename IntegralT,
22+
typename TrueT,
23+
typename FalseT>
24+
struct if_ <integral <IntegralT, 0>, TrueT, FalseT> {
25+
using type = FalseT;
26+
};
27+
28+
template <typename Condition, typename TrueT, typename FalseT>
29+
using if_t = typename if_ <Condition, TrueT, FalseT>::type;
30+
31+
template <bool Condition, typename TrueT, typename FalseT>
32+
using if_vt = typename if_ <bool_ <Condition>, TrueT, FalseT>::type;
33+
34+
//----------------------------------------------------------------------------------------------------------
35+
36+
template <typename Function, typename... Parameters>
37+
struct then_ {
38+
template <typename Condition>
39+
struct apply {
40+
using type = eval_if_default_t <bool_ <Condition::value && sizeof...(Parameters) != 0>, Function, Function, Parameters...>;
41+
};
42+
};
43+
44+
template <typename Function, typename... Parameters>
45+
struct else_ {
46+
template <typename Condition>
47+
struct apply {
48+
using type = eval_if_default_t <bool_ <!Condition::value && sizeof...(Parameters) != 0>, Function, Function, Parameters...>;
49+
};
50+
};
51+
52+
template <typename Condition, typename Then, typename Else>
53+
struct lazy_if {
54+
using type = typename Then::template apply <true_>::type;
55+
};
56+
57+
template <typename Then, typename Else>
58+
struct lazy_if <false_, Then, Else> {
59+
using type = typename Else::template apply <false_>::type;
60+
};
61+
62+
template <typename IntegralT, typename Then, typename Else>
63+
struct lazy_if <integral <IntegralT, 0>, Then, Else> {
64+
using type = typename Else::template apply <false_>::type;
65+
};
66+
67+
template <typename Condition, typename Then, typename Else>
68+
using lazy_if_t = typename lazy_if <Condition, Then, Else>::type;
69+
70+
template <bool Condition, typename Then, typename Else>
71+
using lazy_if_vt = typename lazy_if <bool_ <Condition>, Then, Else>::type;
72+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#pragma once
2+
3+
namespace JSON
4+
{
5+
template <template <typename...> class T>
6+
struct lift {
7+
template <typename... Params>
8+
struct apply
9+
: public T <Params...>
10+
{
11+
};
12+
};
13+
}

0 commit comments

Comments
 (0)