NodeListArray
説明
NodeListArrayクラスの目的は、標準の0ベースのc++配列と同様に、ノードのリストを通常は結合データと一緒にc++で扱えるようにすることです。当社のオブジェクト開発で、次のようなコードを頻繁に作成していることがわかりました。
NetworkNode* nn = &o(NetworkNode, ownerobject(tonode(get(rank(node_v_myNetNodes, i)))));
これは、見た目がかなり奇妙なコードです。そこで、この奇妙なコードをすべてカプセル化して、配列スタイルの構文を使用するだけで済むようなクラスは作れないものかと考えました。そうすれば、正しいNodeListArrayをクラスに追加してmyNetNodes[i]を作成するだけで、正しい逆参照を取得することができます。
今は、結合ノードのリストをセットアップするさまざまな方法があるため、これらのさまざまなタイプのリストを表現するためのさまざまなタイプのNodeListArrayも存在します。たとえば、オブジェクトそのものへの直接的な一方向ポインターのリストを使用できます。または、結合の片側が関連オブジェクトの「保存済み」属性で作成されるような結合ノードのリストを使用できます。
NodeListArrayは、3つのテンプレート入力パラメータが必要なテンプレートクラスですが、通常は、最初のテンプレートパラメータ、つまり、参照先のクラスのタイプを指定するだけで済みます。3つのテンプレートパラメータとは、1つのクラスタイプ、1つのAdder()関数、および1つのGetter()関数です。このクラスのプロトタイプは次のとおりです。
NodeListArray<class T、void (*Adder)(treenode x, T* obj)、T* (*Getter)(treenode x)>
NodeListArrayクラスは、親ノードで初期化する必要があります。リストに新しいオブジェクトが追加されると、NodeListArrayが親ノードに新しい結合ノードを作成します。親ノードは、NodeListArrayによって作成されたもの以外の子ノードの保存に使用しないでください。2つのNodeListArrayが同じ親を共有することはないはずですが、可能性はあります。ノードリスト配列がSDTまたはODTに含まれている場合は、初期化は通常bind()メソッドまたはbindVariables()メソッドで行われます。
メソッド
メソッド | 説明 |
---|---|
void init(treenode parent) | リストの親ノードを指定されたノードに設定します。 |
int size(void) | リストのメンバー数を返します。 |
T* operator [](int index) | Getter()関数を使用して、指定されたインデックスにあるオブジェクトを返します。 |
T* operator [](char* name) | Getter()関数を使用して、指定された名前を持つオブジェクトを返します。 |
T* back(void) | Getter()関数を使用して、リストの最後のオブジェクトを返します。 |
T* add(T* obj) | Adder()関数を使用して、指定されたオブジェクトをリストに追加します。そのオブジェクトが返されます。 |
void remove(int index) | 指定されたインデックス(0ベース)にあるノードをリストから削除します。 |
void clearContents(void) | リストを空にして、親のすべてのサブノードを破棄します。 |
void swap(int index1, int index2) | 2つのインデックスにあるオブジェクトを交換します。 |
int find(T* x) | 指定されたオブジェクトのインデックス(0ベース)を返します。失敗時は-1を返します。 |
タイプ
事前に定義された数種類のノードリスト配列があります。それぞれが、独自の方法でリストに追加したり、リストにアクセスしたりするプロセスを処理します。
注:これらのクラスごとに、Adder()関数は、必ず、新しいノードをリストの親ノードに追加します。この新しいノードは、リストに追加されたデータへのリンクとして使用されます。以降のセクションでは、「新しいサブノード」という表現がこのノードを指します。
NodeListArray<TheClass>::ObjPtrType
これは、ODTまたはSDTオブジェクトへの直接一方向ポインターのリストを表します。例:
NodeListArray<NetworkNode>::ObjPtrType myNetNodes;
myNetNodes[i]を逆参照すると、NetworkNode*が返されます。
Adder() | 新しいサブノードをオブジェクトのホルダーに向けます。オブジェクトは既にノード上に存在している必要があります。 |
---|---|
Getter() | オブジェクトを保持しているノードを返します。 |
NodeListArray<TheClass>::CouplingSdtPtrType
このクラスは、結合sdtノードへの双方向ポインターのリストを表します。リスト内の各アイテムが、ノードを指している結合ノードであるが、結合sdtタイプであるところがObjPtrTypeと似ています。追加されると、オブジェクトへの一方向ポインターの代わりに双方向ポインターを使用してノードを結合します。
Adder() | サブノードを指定されたノードに追加し、双方向ポインターを使用して両方の新しいサブノードを結合します。 |
---|---|
Getter() | 結合された結合sdtノードを返します。 |
NodeListArray<TheClass>::ObjStoredAttCouplingType
このクラスは、オブジェクトデータタイプへの双方向リストを表します。反対側の結合ノードが指定されたオブジェクトの「保存済み」属性ノードに保存されます。
Adder() | オブジェクトの「保存済み」属性で結合ノードを作成し、それを新しいサブノードと結合します。 |
---|---|
Getter() | オブジェクトを保持しているノードを返します。 |
NodeListArray<TheClass>::ObjCouplingType
このクラスの目的は、ObjStoreAttCouplingTypeと同様に動作することですが、反対側の結合ノードを「保存済み」属性ノードに保存する代わりに、反対側のノードをオブジェクト内の他の場所に保存します。そのため、Adder()関数を定義する必要があります。通常は、次のようになります。
void myAdder(treenode x, SomeClass* y) { nodejoin(x, nodeadddata(nodeinsertinto(y->node_v_someNode), DATATYPE_COUPLING); }
Adder() | カスタム動作。 |
---|---|
Getter() | オブジェクトを保持しているノードを返します。 |
NodeListArray<TheClass>::SdtSubNodeType
このクラスは、シンプルデータタイプオブジェクトの直接リストを表します。正常にどこかを指している結合ノードを取得して、その結合データと指定されたシンプルデータを置き換えます。
Adder() | 指定されたシンプルデータを新しいサブノードに追加します。 |
---|---|
Getter() | 直接オブジェクトを返します。 |
NodeListArray<TheClass>::SdtSubNodeBindingType
このクラスは、作成時にシンプルデータタイプオブジェクトをバインドすることを除いて、SdtSubNodeTypeと同様です。
NodeListArray<TheClass>::CouplingSdtSubNodeType
このクラスは、結合データをシンプルデータではなく新しいサブノードに追加することを除いて、SdtSubNodeTypeと同様です。
NodeListArray<TheClass>::CouplingSdtSubNodeBindingType
このクラスは、作成時に結合データタイプオブジェクトをバインドすることを除いて、CouplingSdtSubNodTypeと同様です。
NodeListArray<TheClass>::ObjSubNodeType
このクラスは、odtの.createのストレートリストを表します。
Adder() | 新しいodtサブノードを配列に追加します。 |
---|---|
Getter() | odtノードを返します。 |
NodeListArray<TheClass>::NodePtrType
このクラスは、ツリー内のノードへのポインターのリストを表します。
Adder() | 新しいサブノードを指定されたノードに向けます。 |
---|---|
Getter() | 参照先のノードを返します。 |
NodeListArray<TheClass>::StoredAttCouplingType
このクラスは、オブジェクトへの双方向結合のリストを表します。これは、TreeNode*、つまり、odt/sdtの代わりにノードそのものを返すことを除いて、ObjStoredAttCouplingTypeと同様です。ObjListArrayと同じく、結合の反対側がオブジェクトの「保存済み」属性に保存されます。
Adder() | 「保存済み」属性ノードの存在を保証して、サブノードをそのノードに追加し、両方の新しいサブノード間の双方向リンクを作成します。 |
---|---|
Getter() | 「保存済み」ノードの所有者オブジェクトを保持するノードを返します。 |
NodeListArray<TheClass>::SubNodeCouplingType
このクラスは、ノードへの双方向結合のリストを表します。これは、結合の反対側を参照先のノードのサブノードとして保存し、逆参照されたときに、結合サブノードを含むノードを返します。
Adder() | サブノードを指定されたノードに追加し、両方の新しいサブノードを結合します。 |
---|---|
Getter() | 参照先のノードの親ノードを返します。 |
NodeListArray<TheClass>::SdtSubNodeCouplingType
このクラスは、ノードへの双方向結合のリストを表します。これは、結合の反対側を参照先のオブジェクトのサブノードとして保存し、逆参照されたときに、結合サブノードを含むノードを返します。ノード参照の代わりにオブジェクト参照を返すことを除いて、SubNodeCouplingTypeと同様です。
Adder() | サブノードを指定されたノードに追加し、両方の新しいサブノードを結合します。 |
---|---|
Getter() | 参照先のノードの親ノードを返します。 |
C++の特徴
c++に精通している人のために、NodeListArraysはc++ stlコンテナ方式にも従います。NodeListArraysには反復子を返すbegin()メソッドとend()メソッドがあり、反復子には++インクリメントメソッドがあります。これにより、NodeListArraysは、std::find()、std::sort()、範囲ベースのforループなどのc++のさまざまなstl機能と一緒に使用できるため、コードを明確で読みやすくすることができます。