#ifndef ENTT_CORE_ITERATOR_HPP
|
|
#define ENTT_CORE_ITERATOR_HPP
|
|
|
|
#include <iterator>
|
|
#include <memory>
|
|
#include <utility>
|
|
#include "../config/config.h"
|
|
|
|
namespace entt {
|
|
|
|
/**
|
|
* @brief Helper type to use as pointer with input iterators.
|
|
* @tparam Type of wrapped value.
|
|
*/
|
|
template<typename Type>
|
|
struct input_iterator_pointer final {
|
|
/*! @brief Pointer type. */
|
|
using pointer = Type *;
|
|
|
|
/*! @brief Default copy constructor, deleted on purpose. */
|
|
input_iterator_pointer(const input_iterator_pointer &) = delete;
|
|
|
|
/*! @brief Default move constructor. */
|
|
input_iterator_pointer(input_iterator_pointer &&) = default;
|
|
|
|
/**
|
|
* @brief Constructs a proxy object by move.
|
|
* @param val Value to use to initialize the proxy object.
|
|
*/
|
|
input_iterator_pointer(Type &&val)
|
|
: value{std::move(val)} {}
|
|
|
|
/**
|
|
* @brief Default copy assignment operator, deleted on purpose.
|
|
* @return This proxy object.
|
|
*/
|
|
input_iterator_pointer &operator=(const input_iterator_pointer &) = delete;
|
|
|
|
/**
|
|
* @brief Default move assignment operator.
|
|
* @return This proxy object.
|
|
*/
|
|
input_iterator_pointer &operator=(input_iterator_pointer &&) = default;
|
|
|
|
/**
|
|
* @brief Access operator for accessing wrapped values.
|
|
* @return A pointer to the wrapped value.
|
|
*/
|
|
[[nodiscard]] pointer operator->() ENTT_NOEXCEPT {
|
|
return std::addressof(value);
|
|
}
|
|
|
|
private:
|
|
Type value;
|
|
};
|
|
|
|
/**
|
|
* @brief Utility class to create an iterable object from a pair of iterators.
|
|
* @tparam It Type of iterator.
|
|
* @tparam Sentinel Type of sentinel.
|
|
*/
|
|
template<typename It, typename Sentinel = It>
|
|
struct iterable_adaptor final {
|
|
/*! @brief Value type. */
|
|
using value_type = typename std::iterator_traits<It>::value_type;
|
|
/*! @brief Iterator type. */
|
|
using iterator = It;
|
|
/*! @brief Sentinel type. */
|
|
using sentinel = Sentinel;
|
|
|
|
/*! @brief Default constructor. */
|
|
iterable_adaptor() = default;
|
|
|
|
/**
|
|
* @brief Creates an iterable object from a pair of iterators.
|
|
* @param from Begin iterator.
|
|
* @param to End iterator.
|
|
*/
|
|
iterable_adaptor(iterator from, sentinel to)
|
|
: first{from},
|
|
last{to} {}
|
|
|
|
/**
|
|
* @brief Returns an iterator to the beginning.
|
|
* @return An iterator to the first element of the range.
|
|
*/
|
|
[[nodiscard]] iterator begin() const ENTT_NOEXCEPT {
|
|
return first;
|
|
}
|
|
|
|
/**
|
|
* @brief Returns an iterator to the end.
|
|
* @return An iterator to the element following the last element of the
|
|
* range.
|
|
*/
|
|
[[nodiscard]] sentinel end() const ENTT_NOEXCEPT {
|
|
return last;
|
|
}
|
|
|
|
/*! @copydoc begin */
|
|
[[nodiscard]] iterator cbegin() const ENTT_NOEXCEPT {
|
|
return begin();
|
|
}
|
|
|
|
/*! @copydoc end */
|
|
[[nodiscard]] sentinel cend() const ENTT_NOEXCEPT {
|
|
return end();
|
|
}
|
|
|
|
private:
|
|
It first;
|
|
Sentinel last;
|
|
};
|
|
|
|
} // namespace entt
|
|
|
|
#endif
|