6 * @brief enum もしくは enum class の列挙値の範囲を扱うクラス
8 * @tparam EnumType 対象となる列挙型(enum もしくは enum class)
10 template <typename EnumType>
12 static_assert(std::is_enum_v<EnumType>);
16 * @brief 列挙値の範囲のイテレータクラス
21 * @brief 引数で与えた列挙値を指すイテレータオブジェクトを生成する
23 * @param val イテレータオブジェクトが指す列挙値
25 constexpr iterator(EnumType val) noexcept
26 : index(std::underlying_type_t<EnumType>(val))
31 * @brief イテレータが指している列挙値を取得する
33 * @return イテレータが指している列挙値
35 constexpr EnumType operator*() const noexcept
37 return static_cast<EnumType>(index);
41 * @brief イテレータをインクリメントする
45 iterator &operator++() noexcept
52 * @brief 2つのイテレータが指している列挙値が等しいかどうか調べる
54 * @param other 比較対象となるイテレータ
55 * @return 2つのイテレータが指している列挙値が等しければ true、そうでなければ false
57 constexpr bool operator==(const iterator &other) const noexcept
59 return index == other.index;
63 * @brief 2つのイテレータが指している列挙値が等しくないかどうか調べる
65 * @param other 比較対象となるイテレータ
66 * @return 2つのイテレータが指している列挙値が等しくなければ true、そうでなければ false
68 constexpr bool operator!=(const iterator &other) const noexcept
70 return !this->operator==(other);
74 //! 現在イテレータが指している列挙値の基底型における整数値
75 std::underlying_type_t<EnumType> index;
79 * @brief 引数で与えた範囲の EnumRange クラスのオブジェクトを生成する
80 * @details 生成する範囲はfirstからlastまで(lastを含む)。
81 * 範囲の最終値+1の列挙値が存在しない場合を考慮し、半開区間ではなく閉区間で範囲を指定する。
82 * 範囲のイテレーションは基底型の整数値をインクリメントする事によって行うので、
83 * first から last までの間の整数値が飛んでいる場合、その部分は具体的な定義の無い列挙値がイテレートされる。
84 * @param first 範囲の最初となる列挙値
85 * @param last 範囲の最後となる列挙値(lastも含む)
87 constexpr EnumRange(EnumType first, EnumType last) noexcept
89 , end_val(static_cast<EnumType>(std::underlying_type_t<EnumType>(last) + 1))
94 * @brief 範囲の最初の列挙値を指すイテレータを取得する
96 * @return 範囲の最初の列挙値を指すイテレータ
98 constexpr iterator begin() const noexcept
100 return iterator(begin_val);
104 * @brief 範囲の最後の列挙値の次の値を指すイテレータを取得する
106 * @return 範囲の最後の列挙値の次の値を指すイテレータ
108 constexpr iterator end() const noexcept
110 return iterator(end_val);