4#include "core/builtin/container/iter/uiter.inl"
11#define TEMPL template <typename T, typename R, typename RSquare>
12#define ME tucontainable<T, R, RSquare>
15 ME::~tucontainable() {}
18 nbool ME::in(
const T& t)
const {
19 return in([&](
const T& elem) -> nbool {
return elem == t; });
23 template <
typename T1> nbool ME::in(std::function<nbool(
const T1&)> l)
const {
24 for(
auto e = begin(); e; ++e) {
25 if constexpr(_IS_POINTER) {
26 const T1& val = e->template cast<T1>() OR_CONTINUE;
27 WHEN(l(val)) .ret(true);
29 const T1& val = e.get().template cast<T1>() OR_CONTINUE;
30 WHEN(l(val)) .ret(true);
37 nbool ME::in(std::function<nbool(const T&)> l)
const {
return this->in<T>(l); }
40 nbool ME::isEmpty()
const {
return len() <= 0; }
43 template <
typename K,
typename V> ncnt ME::add(
const tbicontainable<K, V>& rhs) {
44 static_assert(areBaseOfT<T, V>::value,
"given type 'V' is not subtype of 'T'");
46 for(
auto e = rhs.begin(); e; ++e)
52 template <
typename T1> tnarr<T1> ME::getAll(std::function<nbool(
const T1&)> l)
const {
54 for(
auto e = begin(); e; ++e) {
55 if constexpr(_IS_POINTER) {
56 const T1& val = e->template cast<T1>() OR_CONTINUE;
60 const T1& val = e.get().template cast<T1>() OR_CONTINUE;
70 tnarr<T> ME::getAll(std::function<nbool(const T&)> l)
const {
return this->getAll<T>(l); }
73 template <
typename T1>
void ME::each(std::function<nbool(T1&)> l) {
74 for(
auto e = begin(); e; ++e) {
75 if constexpr(_IS_POINTER) {
76 T1& val = e->template cast<T1>() OR_CONTINUE;
79 T1& val = e.get().template cast<T1>() OR_CONTINUE;
86 void ME::each(std::function<nbool(T&)> l) { this->each<T>(l); }
89 typename ME::iter ME::begin()
const {
90 static iter (me::*specifier)(ncnt) const = &me::iterate;
91 return (this->*specifier)(0);
95 typename ME::iter ME::rbegin()
const {
96 static iter (me::*specifier)(ncnt) const = &me::riterate;
97 return (this->*specifier)(0);
101 typename ME::iter ME::end()
const {
109 static iter (me::*specifier)(ncnt) const = &me::iterate;
110 return (this->*specifier)(len());
114 typename ME::iter ME::rend()
const {
115 static iter (me::*specifier)(ncnt) const = &me::riterate;
116 return (this->*specifier)(len());
120 typename ME::iter ME::last()
const {
121 WHEN(len() <= 0) .ret(end());
122 static iter (me::*specifier)(ncnt) const = &me::iterate;
123 return (this->*specifier)(len() - 1);
127 typename ME::iter ME::iterate(ncnt step)
const {
return iter(_onMakeIteration(step,
false)); }
130 typename ME::iter ME::iterate(
const T& it)
const {
131 for(
iter e = begin(); e; ++e)
132 if constexpr(_IS_POINTER) {
133 WHEN(e.get() == &it) .ret(
iter(e));
135 WHEN(e.get() == it) .ret(
iter(e));
142 typename ME::iter ME::riterate(ncnt step)
const {
return iter(_onMakeIteration(step,
true)); }
145 typename ME::iter ME::riterate(
const T& it)
const {
146 for(
iter e = rbegin(); e; ++e)
147 if constexpr(_IS_POINTER) {
148 WHEN(e.get() == &it) .ret(
iter(e));
150 WHEN(e.get() == it) .ret(
iter(e));
157 nbool ME::add(std::initializer_list<const T*> elems) {
159 for(
auto* elem: elems)
165 nbool ME::add(
const T& new1) {
return add(end(), new1); }
168 void ME::add(
const iter& from,
const iter& to) {
return add(end(), from, to); }
171 void ME::add(
const iter& here, me& rhs) {
return add(here, rhs.begin(), rhs.end()); }
174 void ME::add(
const me& rhs) {
return add(end(), rhs.begin(), rhs.end()); }
178 static iter (me::*specifier)(ncnt) const = &me::iterate;
179 return del((this->*specifier)(len() - 1));
183 nbool ME::del(
const T& it) {
184 static iter (me::*specifier)(const T&) const = &me::iterate;
185 return del((this->*specifier)(it));
189 nbool ME::del(
const tucontainable& rhs) {
return del(rhs.begin(), rhs.end()); }
Bidirectional iterator for key-value containers
Definition biter.hpp:10