スマート列挙子ジェネレーター、EnumGenerator

みなさんこんにちは!



数年前、静的な(コンパイルプロセスの前に作成および変更される)列挙の作成について心配し始めました。 C / C ++で実装される単純な転送は必要ありませんでしたが、任意の型の関連データ列、一意の識別子によるアクセスを備えた静的データベースなどの追加機能を備えています。



そして、私の理解では、一意の識別子になる可能性のある3種類のオブジェクトが明確に区別されました。数値インデックス、数値識別子、およびシンボリック識別子です。 キーから値への切り替えの問題を解決するためにそれらのそれぞれを適用しようとすると、主な欠点と利点が形成されました。





EnumGeneratorプロジェクトの主な目的は、これらの識別子を1つの構造に便利、安全、効率的に結合する列挙を生成することです。 そのため、3つの方法で1つの値にアクセスできます。

  1. 数値インデックスでは非常に高速です。 プログラムのテキストで主に使用します。 例:通常のリスト。
  2. 数値識別子による高速で柔軟な。 値を不揮発性ストレージに保存し、そこから安全に回復するため。 同じリストの古いバージョンまたは新しいバージョンを持つ他のプログラムとデータを交換するため。 例:データベース、ネットワーク通信プロトコル。
  3. シンボリック識別子により、便利かつ明確に。 人間が編集できる構成ファイルに値を保存し、そこから安全に回復する。 例:構成ファイル* .ini、* .json、* .yaml、*。Xml。


EnumGeneratorの入力、ExcelテーブルのColor3の列挙:





EnumGeneratorの出力:

ファイル 'Enums.hpp'の列挙Color3
class Color3 { public: enum Value { Black = 0, //! men in black Blue = 1, //! blue ocean Green = 2, //! green forest Invalid = 3, Red = 4, //! lady in red White = 5 //! white snow }; static const int ValueCount = 6; static const Value ValueInvalid = Invalid; Color3(Value val = ValueInvalid) : m_ValueCur(val) {} Color3(const Color3 &other) : m_ValueCur(other.m_ValueCur) {} explicit Color3(int val) : m_ValueCur(ValueInvalid) { int index = NS_JDSoft::NS_EnumGenerator::ValueFindLinear(IDInteger, ValueCount, val); if (index >= 0) m_ValueCur = Value(index); } explicit Color3(const char * val) : m_ValueCur(ValueInvalid) { int index = NS_JDSoft::NS_EnumGenerator::StringFindBinary(StringValues, ValueCount, val); if (index >= 0) m_ValueCur = Value(index); } Color3 &operator =(Value val) { m_ValueCur = val; return *this; } Color3 &operator =(const Color3 &other) { m_ValueCur = other.m_ValueCur; return *this; } bool operator ==(Value val) const { return m_ValueCur == val; } bool operator ==(const Color3 &other) const { return m_ValueCur == other.m_ValueCur; } bool isValid() const { return m_ValueCur != ValueInvalid; } Value toValue() const { return m_ValueCur; } int toInt() const { return IDInteger[m_ValueCur]; } const char * toString() const { return StringValues[m_ValueCur]; } static const char * enumName() { return "Color3"; } private: static const char * const StringValues[ValueCount]; static const int IDInteger[ValueCount]; Value m_ValueCur; };
      
      







ファイル 'Enums.cpp'の列挙Color3
 const char * const Color3::StringValues[Color3::ValueCount]= { "Black", "Blue", "Green", "Invalid", "Red", "White" }; const int Color3::IDInteger[Color3::ValueCount] = { 0, 255, 65280, -1, 16711680, 16777215 };
      
      







QtテストプロジェクトでColor3列挙を使用する例:

 #include "Enums.hpp" ... //         Color3 colorPen; QCOMPARE(colorPen.isValid(), false); // isValid() QVERIFY(colorPen == Color3::Invalid); // operator ==(Value val) //     QCOMPARE(colorPen.toValue(), Color3::Invalid); // toValue() QCOMPARE(colorPen.toInt(), -1); // toInt() QCOMPARE(colorPen.toString(), "Invalid"); // toString() //    colorPen = Color3::Red; // operator =(Value val) QCOMPARE(colorPen.isValid(), true); //     QCOMPARE(colorPen.toValue(), Color3::Red); QCOMPARE(colorPen.toInt(), 0xFF0000); QCOMPARE(colorPen.toString(), "Red"); //      QCOMPARE(Color3(Color3::Green).toString(), "Green"); QCOMPARE(Color3(0x00FF00).toString(), "Green"); QCOMPARE(Color3("Green").toString(), "Green"); //   QVERIFY(Color3(0x0000FF) == Color3("Blue")); // operator ==(const Color3 &other)
      
      





EnumGeneratorを試す方法は?

  1. プロジェクトをコンピューターにダウンロードし、zipをダウンロードして解凍します。
  2. luaインタープリターでEnums.luaファイルを実行します。

    Windowsユーザーにとって最も簡単な方法:

    1)luaインタープリターの最小バージョンをダウンロードして解凍します。

    2)「Enums.lua」ファイルを右クリックし、「開く」または「開く」をクリックして、解凍したファイル「lua.exe」を選択します。

  3. ファイル「Enums.hpp」および「Enums.cpp」がディレクトリに生成されたことを確認してください。 できた! :)


プロジェクトでEnumGeneratorを使用する方法は?

  1. 前の段落で説明したように、EnumGeneratorを試してください。
  2. ファイル「EnumGenerator.lua」のあるディレクトリを安定した場所に移動します。

    ファイル「EnumGenerator.lua」があるディレクトリへのパスは「ENUMGENERATOR_PATH」と呼ばれます。
  3. ファイル「Enums.lua」を開き、EnumGenerator変数にジェネレーターへのフルパスが含まれるように編集します。

    このプロジェクトおよび後続のプロジェクトでは、これを1回行う必要があります。

  4. ファイル「Enums.xls」と「Enums.lua」をプロジェクトのディレクトリにコピーします。
  5. 列挙用にExcelまたはOpenOfficeで「Enums.xls」ファイルを編集します。
  6. 編集したファイル「Enums.xls」をそのまま保存し、さらにcsv形式でファイル「Enums.csv」に保存し、エディターを閉じます。
  7. luaインタープリターのプロジェクトのディレクトリーからEnums.luaファイルを実行し、生成が成功したことを確認します。

    • コンソールモードで起動すると、スクリプトは「Successfully completed!」と書き込みます。
    • 別のプログラムから起動した場合、インタープリターの戻りコードは0です。


EnumGeneratorを使用する場合のデータフローチャート:





以下に 、ジェネレーターであるExcelファイルを使用する主な機能を明確に示すを示します。



このファイルの一部をさらに詳しく見てみましょう。





入力ファイル構造:

  1. ファイルは独立したブロック部分[0;∞]で構成されます。 各パートは、「PartBegin」という単語で始まり、左端のセルの「PartEnd」という単語で終わります。 「PartBegin」の後、このセルの必須およびオプションのパラメーターは、同じセル内の括弧内に示されます。例:PartBegin(Type = Enum、Name = Country)。 「PartBegin」と「PartEnd」の間のすべての行は、パーツの本体(PartData)です。 パーツのシーケンスが考慮されます。
  2. パーツの本体(PartData)は、0番目の列(左端)で構成され、行全体と後続のセル[0;∞]のタイプを決定します。 現在、3つのタイプが実装されています。ヘッダー-データタイトル、コメント-コメント、 ""(空行)-タイトルに応じたメインデータが含まれています。
  3. データヘッダー(ヘッダー)は、必要な列識別子と可能な追加パラメーターを記述します。


これが明確でシンプルで論理的に見えることを願っています。



改善のためのフィードバックと提案を歓迎します、ありがとう!



関連リンク:

文字列列挙-文字列列挙

Pythonの別のEnums実装



All Articles