Exiv2::Slice< container > Struct Template Reference

Slice (= view) for STL containers. More...

#include <slice.hpp>

Inheritance diagram for Exiv2::Slice< container >:

Public Types

typedef container::iterator iterator
 
typedef container::const_iterator const_iterator
 
typedef Internal::remove_cv< typename container::value_type >::type value_type
 
- Public Types inherited from Exiv2::Internal::MutableSliceBase< Internal::ContainerStorage, container >
typedef ConstSliceBase< Internal::ContainerStorage, container >::iterator iterator
 
typedef ConstSliceBase< Internal::ContainerStorage, container >::const_iterator const_iterator
 
typedef ConstSliceBase< Internal::ContainerStorage, container >::value_type value_type
 
- Public Types inherited from Exiv2::Internal::ConstSliceBase< Internal::ContainerStorage, container >
typedef Internal::ContainerStorage< container >::iterator iterator
 
typedef Internal::ContainerStorage< container >::const_iterator const_iterator
 
typedef Internal::ContainerStorage< container >::value_type value_type
 

Public Member Functions

 Slice (container &cont, size_t begin, size_t end)
 Construct a slice of the container cont starting at begin (including) and ending before end. More...
 
Slice subSlice (size_t begin, size_t end)
 
Slice< const container > subSlice (size_t begin, size_t end) const
 
- Public Member Functions inherited from Exiv2::Internal::MutableSliceBase< Internal::ContainerStorage, container >
 MutableSliceBase (container &data, size_t begin, size_t end)
 
value_type & at (size_t index)
 
const value_type & at (size_t index) const
 
iterator begin () throw ()
 
iterator end () throw ()
 
- Public Member Functions inherited from Exiv2::Internal::ConstSliceBase< Internal::ContainerStorage, container >
 ConstSliceBase (container &data, size_t begin, size_t end)
 
const value_type & at (size_t index) const
 
const_iterator cbegin () const throw ()
 
const_iterator cend () const throw ()
 
slice_type subSlice (size_t begin, size_t end) const
 
- Public Member Functions inherited from Exiv2::Internal::SliceBase
 SliceBase (size_t begin, size_t end)
 
size_t size () const throw ()
 

Additional Inherited Members

- Protected Types inherited from Exiv2::Internal::MutableSliceBase< Internal::ContainerStorage, container >
typedef ConstSliceBase< Internal::ContainerStorage, container > base_type
 
- Protected Member Functions inherited from Exiv2::Internal::MutableSliceBase< Internal::ContainerStorage, container >
ConstSliceBase< Internal::ContainerStorage, const container > to_const_base () const throw ()
 
slice_type subSlice (size_t begin, size_t end)
 
- Protected Member Functions inherited from Exiv2::Internal::SliceBase
void rangeCheck (size_t index) const
 
- Protected Attributes inherited from Exiv2::Internal::ConstSliceBase< Internal::ContainerStorage, container >
Internal::ContainerStorage< container > storage_
 
- Protected Attributes inherited from Exiv2::Internal::SliceBase
const size_t begin_
 
const size_t end_
 

Detailed Description

template<typename container>
struct Exiv2::Slice< container >

Slice (= view) for STL containers.

This is a very simple implementation of slices (i.e. views of sub-arrays) for STL containers that support O(1) element access and random access iterators (like std::vector, std::array and std::string).

A slice represents the semi-open interval [begin, end) and provides a (mutable) view, it does however not own the data! It can be used to conveniently pass parts of containers into functions without having to use iterators or offsets.

In contrast to C++20's std::span<T> it is impossible to read beyond the container's bounds and unchecked access is not-possible (by design).

Example usage:

std::vector<int> vec = {0, 1, 2, 3, 4};
slice<std::vector<int> > one_two(vec, 1, 3);
assert(one_two.size() == 2);
assert(one_two.at(0) == 1 && one_two.at(1) == 2);
// mutate the contents:
one_two.at(0) *= 2;
one_two.at(1) *= 3;
assert(one_two.at(0) == 2 && one_two.at(1) == 6);

Slices also offer access via iterators of the same type as the underlying container, so that they can be used in a comparable fashion:

std::vector<int> vec = {0, 1, 2, 3, 4};
slice<std::vector<int>> three_four(vec, 3, 5);
assert(*three_four.begin() == 3 && *three_four.end() == 4);
// this prints:
// 3
// 4
for (const auto & elem : three_four) {
std::cout << elem << std::endl;
}
Template Parameters
containerA STL container type, like vector or array. Must support array-like access via the at() method.

Constructor & Destructor Documentation

◆ Slice()

template<typename container>
Exiv2::Slice< container >::Slice ( container &  cont,
size_t  begin,
size_t  end 
)
inline

Construct a slice of the container cont starting at begin (including) and ending before end.

Parameters
[in]contReference to the container
[in]beginFirst element of the slice.
[in]endFirst element beyond the slice.
Exceptions
std::out_of_rangeFor invalid slice bounds: when end is not larger than begin or when the slice's bounds are larger than the container's size.

Please note that due to the requirement that end must be larger than begin (they cannot be equal) it is impossible to construct a slice with zero length.

Member Function Documentation

◆ subSlice() [1/2]

template<typename container>
Slice Exiv2::Slice< container >::subSlice ( size_t  begin,
size_t  end 
)
inline

Construct a sub-slice of this slice with the given bounds. The bounds are evaluated with respect to the current slice.

Parameters
[in]beginFirst element in the new slice.
[in]endFirst element beyond the new slice.
Exceptions
std::out_of_rangewhen begin or end are invalid

◆ subSlice() [2/2]

template<typename container>
Slice<const container> Exiv2::Slice< container >::subSlice ( size_t  begin,
size_t  end 
) const
inline

Constructs a new constant subSlice. Behaves otherwise exactly like the non-const version.


The documentation for this struct was generated from the following file: