OSDN Git Service

[Feature] FlagGruop クラスに EnumRange を受け取るコンストラクタを追加
authorHabu <habu1010+github@gmail.com>
Thu, 21 Oct 2021 15:50:01 +0000 (00:50 +0900)
committerHabu <habu1010+github@gmail.com>
Thu, 21 Oct 2021 16:15:09 +0000 (01:15 +0900)
FlagGroup クラスに、引数として EnumRange クラスのオブジェクトを受け取る
コンストラクタを追加する。
これにより以下のような使い方ができる。

if (flags.has_any_of(EnumRange(TR_STR, TR_CHR))) {
    // flags が TR_STR ~ TR_CHR のいずれかのフラグを持っている
}

src/util/enum-range.h
src/util/flag-group.h

index 939731a..227bb71 100644 (file)
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <iterator>
 #include <type_traits>
 
 /*!
@@ -17,6 +18,13 @@ public:
      */
     class iterator {
     public:
+        // std::iterator_traits に対応するための定義
+        using difference_type = int;
+        using value_type = EnumType;
+        using pointer = const EnumType *;
+        using reference = const EnumType &;
+        using iterator_category = std::input_iterator_tag;
+
         /*!
          * @brief 引数で与えた列挙値を指すイテレータオブジェクトを生成する
          *
index dd5bfa3..1c8da66 100644 (file)
@@ -3,6 +3,9 @@
 #include <bitset>
 #include <optional>
 
+template <typename T>
+class EnumRange;
+
 /**
  * @brief フラグ集合を扱う、FlagGroupクラス
  *
@@ -51,6 +54,19 @@ public:
     /**
      * @brief FlagGroupクラスのコンストラクタ
      *
+     * EnumRangeクラスで指定した範囲のフラグがON、それ以外はOFFの状態の
+     * FlagGroupクラスのインスタンスを生成する
+     *
+     * @param range 範囲を示すEnumRangeクラスのオブジェクト
+     */
+    FlagGroup(const EnumRange<FlagType> &range)
+        : FlagGroup(range.begin(), range.end())
+    {
+    }
+
+    /**
+     * @brief FlagGroupクラスのコンストラクタ
+     *
      * 入力イテレータで指定した範囲のリストに含まれるフラグがON、
      * それ以外のフラグがOFFの状態のFlagGroupクラスのインスタンスを生成する
      *