3 #include <boost/hana/is_empty.hpp>
4 #include <boost/hana/tuple.hpp>
5 #include <boost/hana/fold.hpp>
6 #include <boost/hana/concat.hpp>
7 #include <boost/hana/map.hpp>
11 namespace hana = boost::hana;
32 template <
typename Key>
35 constexpr
auto operator = (T&& v)
const {
36 return hana::make_pair(*
this, std::forward<T>(v));
51 template <
typename Map,
typename Key>
53 static_assert(decltype(hana::is_a<hana::map_tag>(map))::
value,
"Map should be boost::hana::map");
54 static_assert(decltype(hana::contains(map, op))::
value,
"option has not been found");
69 template <
typename Map,
typename Key,
typename T>
71 static_assert(decltype(hana::is_a<hana::map_tag>(map))::
value,
"Map should be boost::hana::map");
72 if constexpr (decltype(hana::contains(map, op))::
value) {
75 return std::forward<T>(default_);
104 template <
typename ...Options>
106 return hana::make_map(std::forward<Options>(opts)...);
120 template <
typename RealType,
typename Options>
124 template <
typename OtherOptions>
125 constexpr
static auto rebind(OtherOptions&& v) {
126 return RealType::rebind_options(std::forward<OtherOptions>(v));
136 static_assert(decltype(hana::is_a<hana::map_tag>(v))::
value,
"Options should be boost::hana::map");
167 #ifdef OZO_DOCUMENTATION
168 template <
typename Options>
171 template <
typename Key,
typename T>
172 constexpr decltype(
auto)
set(hana::pair<ozo::
option<Key>, T> v) && {
173 if constexpr (decltype(
has(hana::first(v)))::
value) {
174 v_[hana::first(v)] = std::move(hana::second(std::move(v)));
175 return static_cast<RealType&&
>(*this);
177 return rebind(hana::insert(std::move(v_), std::move(v)));
181 template <
typename Key1,
typename T1,
typename Key2,
typename T2,
typename ...Ts>
182 constexpr decltype(
auto)
set(hana::pair<ozo::
option<Key1>, T1> v1, hana::pair<ozo::
option<Key2>, T2> v2, Ts ...vs) && {
184 hana::make_tuple(std::move(v1), std::move(v2), std::move(vs)...),
186 [](
auto self,
auto v) {
return std::move(
self).set(v);}
190 template <
typename Key,
typename T,
typename ...Ts>
191 constexpr decltype(
auto)
set(hana::pair<ozo::option<Key>, T> v, Ts ...vs) const & {
193 return std::move(copy).set(std::move(v), std::move(vs)...);
196 template <
typename Key,
typename T>
197 constexpr decltype(
auto)
set(ozo::option<Key> op, T&& value) && {
198 return std::move(*this).set(hana::make_pair(op, std::forward<T>(value)));
201 template <
typename Key,
typename T>
202 constexpr decltype(
auto)
set(ozo::option<Key> op, T&& value) const & {
203 return set(hana::make_pair(op, std::forward<T>(value)));
231 template <
typename Key>
233 return hana::contains(
options(), op);
242 template <
typename Key>
243 constexpr decltype(
auto)
get(ozo::
option<Key> op)
const {
250 constexpr
const Options&
options() const & {
return v_;}
258 constexpr Options&&
options() && {
return std::move(v_);}
269 template <
typename Options = decltype(hana::make_map())>
274 template <
typename OtherOptions>
275 constexpr
static auto rebind_options(OtherOptions&&
options) {