14 #ifndef CORE_ITERATOR_HPP 15 #define CORE_ITERATOR_HPP 28 template <
class Container>
29 constexpr
auto size (Container
const& container) noexcept -> decltype(
31 ) {
return container.size(); }
33 template <
class T, ::std::
size_t N>
34 constexpr ::std::size_t
size (T
const (&)[N]) noexcept {
return N; }
36 template <
class Container>
37 constexpr
bool empty (Container
const& container) noexcept {
38 return container.empty();
41 template <
class T, std::
size_t N>
42 constexpr
bool empty (T
const (&)[N]) noexcept {
return false; }
45 template <
class Container>
46 constexpr
auto front (Container
const& container) -> decltype(
48 ) {
return container.front(); }
50 template <
class Container>
51 constexpr
auto front (Container& container) -> decltype(container.front()) {
52 return container.front();
55 template <
class T, ::std::
size_t N>
56 constexpr T
const&
front (T
const (&array)[N]) noexcept {
return array[0]; }
58 template <
class T, ::std::
size_t N>
59 constexpr T&
front (T (&array)[N]) noexcept {
return array[0]; }
61 template <
class Container>
62 constexpr
auto back (Container
const& container) -> decltype(
64 ) {
return container.back(); }
66 template <
class Container>
67 constexpr
auto back (Container& container) -> decltype(container.back()) {
68 return container.back();
71 template <
class T, ::std::
size_t N>
72 constexpr T
const&
back (T
const (&array)[N]) noexcept {
return array[N - 1]; }
74 template <
class T, ::std::
size_t N>
75 constexpr T&
back (T (&array)[N]) noexcept {
return array[N - 1]; }
78 template <
class Container>
79 constexpr
auto data (Container
const& container) noexcept -> decltype(
81 ) {
return container.data(); }
83 template <
class Container>
84 constexpr
auto data (Container& container) noexcept -> decltype(
86 ) {
return container.data(); }
88 template <
class T, ::std::
size_t N>
89 constexpr T
const*
data (T
const (&array)[N]) noexcept {
return array; }
91 template <
class T, ::std::
size_t N>
92 constexpr T*
data (T (&array)[N]) noexcept {
return array; }
95 template <
class Container>
96 auto cbegin (Container
const& container) -> decltype(::std::begin(container)) {
97 return ::std::begin(container);
100 template <
class Container>
101 auto cend (Container
const& container) -> decltype(::std::end(container)) {
102 return ::std::end(container);
105 template <
class Container>
106 auto rbegin (Container
const& container) -> decltype(container.rbegin()) {
107 return container.rbegin();
110 template <
class Container>
111 auto rbegin (Container& container) -> decltype(container.rbegin()) {
112 return container.rbegin();
115 template <
class Container>
120 template <
class Container>
121 auto rend (Container
const& container) -> decltype(container.rend()) {
122 return container.rend();
125 template <
class Container>
126 auto rend (Container& container) -> decltype(container.rend()) {
127 return container.rend();
130 template <
class Container>
131 auto crend (Container
const& container) -> decltype(
rend(container)) {
132 return rend(container);
135 template <
class Iterator>
137 return ::std::reverse_iterator<Iterator>(iter);
143 class Traits=::std::char_traits<CharT>
145 ::std::output_iterator_tag,
158 delimiter { delimiter }
169 if (not first and delimiter) { this->stream << delimiter; }
170 this->stream << item;
193 static_assert(::std::is_integral<value_type>::value,
"");
214 this->value += this->step;
219 this->value -= this->step;
232 return this->value == that.value and this->step == that.step;
236 return this->value != that.value and this->step == that.step;
249 template <
class CharT,
class Traits,
class DelimT>
251 ::std::basic_ostream<CharT, Traits>& stream,
256 ::core::forward<DelimT>(delimiter)
constexpr bool empty(Container const &container) noexcept
number_iterator< T > make_number_iterator(T value, T step) noexcept
auto rbegin(Container const &container) -> decltype(container.rbegin())
constexpr auto size(Container const &container) noexcept -> decltype(container.size())
auto cend(Container const &container) -> decltype(::std::end(container))
Copyright © 2013 - 2015 MNMLSTC.
add_pointer_t< T > pointer
::std::bidirectional_iterator_tag iterator_category
typename ::std::add_lvalue_reference< T >::type add_lvalue_reference_t
ostream_joiner(ostream_type &stream, delimiter_type &&delimiter)
number_iterator(value_type value, value_type step=1) noexcept
::std::reverse_iterator< Iterator > make_reverse_iterator(Iterator iter)
ostream_joiner(ostream_type &stream, delimiter_type const &delimiter)
constexpr auto data(Container const &container) noexcept -> decltype(container.data())
ostream_joiner< decay_t< DelimT >, CharT, Traits > make_ostream_joiner(::std::basic_ostream< CharT, Traits > &stream, DelimT &&delimiter)
ostream_joiner & operator*() noexcept
bool operator==(basic_string_view< CharT, Traits > lhs, basic_string_view< CharT, Traits > rhs) noexcept
auto crend(Container const &container) -> decltype(rend(container))
void swap(any &lhs, any &rhs) noexcept
auto cbegin(Container const &container) -> decltype(::std::begin(container))
ostream_joiner & operator++() noexcept
constexpr auto front(Container const &container) -> decltype(container.front())
typename ::std::add_pointer< T >::type add_pointer_t
void swap(number_iterator< T > &lhs, number_iterator< T > &rhs) noexcept
constexpr auto back(Container const &container) -> decltype(container.back())
auto crbegin(Container const &container) -> decltype(rbegin(container))
ostream_joiner & operator=(T const &item)
add_lvalue_reference_t< T > reference
bool operator!=(basic_string_view< CharT, Traits > lhs, basic_string_view< CharT, Traits > rhs) noexcept
void swap(number_iterator &that) noexcept
auto rend(Container const &container) -> decltype(container.rend())
auto move(Range &&rng, OutputIt &&it) -> enable_if_t< is_range< Range >::value, decay_t< OutputIt > >
::std::basic_ostream< CharT, Traits > ostream_type