🛠️🐜 Antkeeper superbuild with dependencies included https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
2.9 KiB

  1. #ifndef ENTT_CORE_ITERATOR_HPP
  2. #define ENTT_CORE_ITERATOR_HPP
  3. #include <iterator>
  4. #include <memory>
  5. #include <utility>
  6. #include "../config/config.h"
  7. namespace entt {
  8. /**
  9. * @brief Helper type to use as pointer with input iterators.
  10. * @tparam Type of wrapped value.
  11. */
  12. template<typename Type>
  13. struct input_iterator_pointer final {
  14. /*! @brief Pointer type. */
  15. using pointer = Type *;
  16. /*! @brief Default copy constructor, deleted on purpose. */
  17. input_iterator_pointer(const input_iterator_pointer &) = delete;
  18. /*! @brief Default move constructor. */
  19. input_iterator_pointer(input_iterator_pointer &&) = default;
  20. /**
  21. * @brief Constructs a proxy object by move.
  22. * @param val Value to use to initialize the proxy object.
  23. */
  24. input_iterator_pointer(Type &&val)
  25. : value{std::move(val)} {}
  26. /**
  27. * @brief Default copy assignment operator, deleted on purpose.
  28. * @return This proxy object.
  29. */
  30. input_iterator_pointer &operator=(const input_iterator_pointer &) = delete;
  31. /**
  32. * @brief Default move assignment operator.
  33. * @return This proxy object.
  34. */
  35. input_iterator_pointer &operator=(input_iterator_pointer &&) = default;
  36. /**
  37. * @brief Access operator for accessing wrapped values.
  38. * @return A pointer to the wrapped value.
  39. */
  40. [[nodiscard]] pointer operator->() ENTT_NOEXCEPT {
  41. return std::addressof(value);
  42. }
  43. private:
  44. Type value;
  45. };
  46. /**
  47. * @brief Utility class to create an iterable object from a pair of iterators.
  48. * @tparam It Type of iterator.
  49. * @tparam Sentinel Type of sentinel.
  50. */
  51. template<typename It, typename Sentinel = It>
  52. struct iterable_adaptor final {
  53. /*! @brief Value type. */
  54. using value_type = typename std::iterator_traits<It>::value_type;
  55. /*! @brief Iterator type. */
  56. using iterator = It;
  57. /*! @brief Sentinel type. */
  58. using sentinel = Sentinel;
  59. /*! @brief Default constructor. */
  60. iterable_adaptor() = default;
  61. /**
  62. * @brief Creates an iterable object from a pair of iterators.
  63. * @param from Begin iterator.
  64. * @param to End iterator.
  65. */
  66. iterable_adaptor(iterator from, sentinel to)
  67. : first{from},
  68. last{to} {}
  69. /**
  70. * @brief Returns an iterator to the beginning.
  71. * @return An iterator to the first element of the range.
  72. */
  73. [[nodiscard]] iterator begin() const ENTT_NOEXCEPT {
  74. return first;
  75. }
  76. /**
  77. * @brief Returns an iterator to the end.
  78. * @return An iterator to the element following the last element of the
  79. * range.
  80. */
  81. [[nodiscard]] sentinel end() const ENTT_NOEXCEPT {
  82. return last;
  83. }
  84. /*! @copydoc begin */
  85. [[nodiscard]] iterator cbegin() const ENTT_NOEXCEPT {
  86. return begin();
  87. }
  88. /*! @copydoc end */
  89. [[nodiscard]] sentinel cend() const ENTT_NOEXCEPT {
  90. return end();
  91. }
  92. private:
  93. It first;
  94. Sentinel last;
  95. };
  96. } // namespace entt
  97. #endif