class new in Git master
StringIterableWrapper for any sequential container of strings or string views.
Useful where it's desirable to have a single interface accepting an ArrayView of String, StringView or const char*
and anything convertible to these.
This class adds extra indirection to allow iterating over various input containers with a single code path. Assuming the API itself isn't bottlenecked on iteration performance, it should be an acceptable tradeoff compared to having to implement multiple code paths or have extra overloads that unify the process by copying the data to a temporary container first.
Usage
A StringIterable can be implicitly created from an ArrayView<StringView> or StridedArrayView1D<StringView>, (strided) array view of (const
) String, const char*
; std::
Example usage — passing main()
arguments to StringView::
int main(int argc, char** argv); int main(int argc, char** argv) { Utility::Debug{} << " "_s.join(Containers::arrayView(argv, argc)); }
On the API implementation side, the usual container interface is exposed — in particular isEmpty(), size(), operator[](), front(), back() as well as range-for access:
void foo(const Containers::StringIterable& strings) { for(Containers::StringView string: strings) { … } }
STL compatibility
Including Corrade/
#include <Corrade/Containers/ArrayViewStl.h> #include <Corrade/Containers/StringStl.h> … std::vector<std::string> a{"hello", "world", "!"}; Containers::StringIterable b = a;
On compilers that support C++17, including Corrade/
#include <Corrade/Containers/ArrayViewStlSpan.h> #include <Corrade/Containers/StringStlView.h> … std::span<std::string_view> a = …; Containers::StringIterable b = a;
Constructors, destructors, conversion operators
-
StringIterable(std::
nullptr_t = nullptr) constexpr noexcept - Default constructor.
-
template<class U, class = decltype(StringIterable{std::StringIterable(U&& data) noexcept
declval<U && >(), Implementation::IterableOverloadPriority<1>{}})> - Construct from any sequential iterable container.
-
StringIterable(std::
initializer_list<StringView> view) noexcept - Construct from an initializer list.
-
StringIterable(const void* data,
const void* context,
std::
size_t size, std:: ptrdiff_t stride, StringView(*)(const void*, const void*, std:: ptrdiff_t, std:: size_t) accessor) explicit noexcept - Construct a custom iterable.
- operator bool() const explicit
- Whether the iterable is non-empty.
Public functions
- auto data() const -> const void*
- Container data pointer.
- auto context() const -> const void*
- Context pointer.
-
auto size() const -> std::
size_t - Number of items in the container.
-
auto stride() const -> std::
ptrdiff_t - Stride between items in the container.
- auto isEmpty() const -> bool
- Whether the container is empty.
-
auto operator[](std::
size_t i) const -> StringView - Element access.
- auto begin() const -> StringIterableIterator
- Iterator to first element.
- auto cbegin() const -> StringIterableIterator
- auto end() const -> StringIterableIterator
- Iterator to (one item after) last element.
- auto cend() const -> StringIterableIterator
- auto front() const -> StringView
- First element.
- auto back() const -> StringView
- Last element.
Function documentation
Corrade:: Containers:: StringIterable:: StringIterable(std:: nullptr_t = nullptr) constexpr noexcept
Default constructor.
Creates an instance with nullptr
data and size and stride set to 0
.
template<class U, class = decltype(StringIterable{std:: declval<U && >(), Implementation::IterableOverloadPriority<1>{}})>
Corrade:: Containers:: StringIterable:: StringIterable(U&& data) noexcept
Construct from any sequential iterable container.
U
can be an ArrayView<T>, StridedArrayView1D<T> and any type convertible to these — see ArrayView and StridedArrayView docs for more information.
The T
can then be (const
) String, StringView, MutableStringView or const char*
.
Corrade:: Containers:: StringIterable:: StringIterable(const void* data,
const void* context,
std:: size_t size,
std:: ptrdiff_t stride,
StringView(*)(const void*, const void*, std:: ptrdiff_t, std:: size_t) accessor) explicit noexcept
Construct a custom iterable.
Parameters | |
---|---|
data | Container data pointer |
context | Context pointer or nullptr |
size | Number of items in the container |
stride | Stride between items in the container |
accessor | Accessor function |
For item i
, the accessor
gets data + i*stride
in the first argument, context
in the second argument, stride
in the third argument and i
in the fourth argument. The context
is useful for example in case the iterated container contains just offsets to string values stored in an external location. The index can be used for handling various edge cases in the accessor, the stride for example if it's needed to retrieve the previous or next data value as well.
const void* Corrade:: Containers:: StringIterable:: data() const
Container data pointer.
Not meant to be used directly, as the returned value may point to an arbitrary string (view) type, with no possibility to distinguish it.
const void* Corrade:: Containers:: StringIterable:: context() const
Context pointer.
Filled only by StringIterable(const void*, const void*, std::size_t, std::ptrdiff_t, StringView(*)(const void*, const void*)), nullptr
otherwise.
std:: size_t Corrade:: Containers:: StringIterable:: size() const
Number of items in the container.
std:: ptrdiff_t Corrade:: Containers:: StringIterable:: stride() const
Stride between items in the container.
Depends on size of the actual string (view) type as well as whether the original container is contiguous.
bool Corrade:: Containers:: StringIterable:: isEmpty() const
Whether the container is empty.
StringView Corrade:: Containers:: StringIterable:: operator[](std:: size_t i) const
Element access.
Expects that i
is less than size(). The returned view has StringViewFlag::const char*
, all items will have StringViewFlag::
StringIterableIterator Corrade:: Containers:: StringIterable:: begin() const
Iterator to first element.
StringIterableIterator Corrade:: Containers:: StringIterable:: cbegin() const
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
StringIterableIterator Corrade:: Containers:: StringIterable:: end() const
Iterator to (one item after) last element.
StringIterableIterator Corrade:: Containers:: StringIterable:: cend() const
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
StringView Corrade:: Containers:: StringIterable:: front() const
First element.
Expects there is at least one element. See operator[]() for information about returned StringViewFlags.
StringView Corrade:: Containers:: StringIterable:: back() const
Last element.
Expects there is at least one element. See operator[]() for information about returned StringViewFlags.