7 * @brief enum もしくは enum class の列挙値の範囲を扱うクラス
9 * @tparam EnumType 対象となる列挙型(enum もしくは enum class)
11 template <typename EnumType>
13 static_assert(std::is_enum_v<EnumType>);
17 * @brief 列挙値の範囲のイテレータクラス
21 // std::iterator_traits に対応するための定義
22 using difference_type = int;
23 using value_type = EnumType;
24 using pointer = const EnumType *;
25 using reference = const EnumType &;
26 using iterator_category = std::input_iterator_tag;
29 * @brief 引数で与えた列挙値を指すイテレータオブジェクトを生成する
31 * @param val イテレータオブジェクトが指す列挙値
33 constexpr iterator(EnumType val) noexcept
34 : index(std::underlying_type_t<EnumType>(val))
39 * @brief イテレータが指している列挙値を取得する
41 * @return イテレータが指している列挙値
43 constexpr EnumType operator*() const noexcept
45 return static_cast<EnumType>(index);
49 * @brief イテレータをインクリメントする
53 iterator &operator++() noexcept
60 * @brief 2つのイテレータが指している列挙値が等しいかどうか調べる
62 * @param other 比較対象となるイテレータ
63 * @return 2つのイテレータが指している列挙値が等しければ true、そうでなければ false
65 constexpr bool operator==(const iterator &other) const noexcept
67 return index == other.index;
71 * @brief 2つのイテレータが指している列挙値が等しくないかどうか調べる
73 * @param other 比較対象となるイテレータ
74 * @return 2つのイテレータが指している列挙値が等しくなければ true、そうでなければ false
76 constexpr bool operator!=(const iterator &other) const noexcept
78 return !this->operator==(other);
82 //! 現在イテレータが指している列挙値の基底型における整数値
83 std::underlying_type_t<EnumType> index;
87 * @brief 引数で与えた範囲の EnumRange クラスのオブジェクトを生成する
88 * @details 生成する範囲はfirstからlastまで(lastを含む)。
89 * 範囲の最終値+1の列挙値が存在しない場合を考慮し、半開区間ではなく閉区間で範囲を指定する。
90 * 範囲のイテレーションは基底型の整数値をインクリメントする事によって行うので、
91 * first から last までの間の整数値が飛んでいる場合、その部分は具体的な定義の無い列挙値がイテレートされる。
92 * @param first 範囲の最初となる列挙値
93 * @param last 範囲の最後となる列挙値(lastも含む)
95 constexpr EnumRange(EnumType first, EnumType last) noexcept
97 , end_val(static_cast<EnumType>(std::underlying_type_t<EnumType>(last) + 1))
102 * @brief 範囲の最初の列挙値を指すイテレータを取得する
104 * @return 範囲の最初の列挙値を指すイテレータ
106 constexpr iterator begin() const noexcept
108 return iterator(begin_val);
112 * @brief 範囲の最後の列挙値の次の値を指すイテレータを取得する
114 * @return 範囲の最後の列挙値の次の値を指すイテレータ
116 constexpr iterator end() const noexcept
118 return iterator(end_val);
122 * @brief 範囲に含まれる列挙値の種類数を取得する
124 * @return 範囲に含まれる列挙値の種類数
126 constexpr std::size_t size() const noexcept
128 return static_cast<std::size_t>(end_val) - static_cast<std::size_t>(begin_val);