Tools.h++ 7.0 クラスライブラリ・リファレンスマニュアル: RWCollection

バナーをクリックすれば目次に戻ります

Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.

## RWCollection

RWCollection RWCollectable

### 形式

      #include <rw/colclass.h>
      typedef RWCollection Collection;   // Smalltalk typedef

### 説明

  このクラスは、Smalltalk 式コレクションクラスの抽象基底クラスです。RWCollectable オブジェクトへのポインタをコレクションクラスに挿入したり取り出したりする仮想関数を持っています。また、コレクションをファイルやストリームとの間で格納したり取り出す仮想関数もあります。この基底クラスを継承するコレクションでは通常、これらの関数が 1 つまたは複数個再定義されます。

  以下の記述において、純粋仮想関数は宣言中で "= 0" で示されています。これらの純粋仮想関数の定義は、派生クラス内で行わなければなりません。純粋仮想関数の記述は総称であり、すべての継承コレクションクラスは通常、ここで記述されたパターンに従います。例外については、個々のクラスの記述に記してあります。

  多くの関数は、RWCollection によって適切な定義が与えられているので、派生クラスで再定義する必要はありません (`contains()` や `restoreGuts()` など)。

### 持続性

  多相

### 公開メンバー演算子

      void
      operator+=(const RWCollection&);
      void
      operator-=(const RWCollection&);

    引数の項目を自分自身との間で追加したり削除したりします。RWBinaryTree 上で `operator+=(somePreSortedCollection)` を使用すると、ツリーのバランスがとれなくなり、スタックのオーバーフローを起こす可能性があります。

### 公開メンバー関数

      virtual
      ~RWCollection();

    空定義 (何もしない)。

      virtual void
      apply(RWapplyCollectable ap, void*) = 0;

    この関数は、コレクションの各メンバーに、ユーザー定義関数 `ap` を適用します。この関数には次のようなプロトタイプが必要です。

        void yourApplyFunction(RWCollectable* ctp, void*);

    `yourApplyFunction()` は、アドレス `ctp` にある項目に対してハッシュ値または項目の順序を変えないような操作であればどのような操作でも実行できます。第 2 引数を使用して、クライアントデータをこの関数に渡すことができます。

      RWBag
      asBag() const;
      RWSet
      asSet() const;
      RWOrdered
      asOrderedCollection() const;
      RWBinaryTree
      asSortedCollection() const;

    任意のコレクションを、RWBag、RWSet、RWOrdered、または RWBinaryTree に変換できます。返す値は、そのデータのコピーであることに注意してください。大きなコレクションの場合、これは高価になります。`operator+=()` を使用して各 RWCollectableAssociation をこのディクショナリから、選択したコレクションに挿入する方法も利用できます。また、すでにソートされたデータを含むコレクションを、`asSortedCollection()` または `asBinaryTree()` メソッドにより RWBinaryTree に変換すると、大変バランスの悪いツリーを作成します。

      virtual RWspace
      binaryStoreSize() const;

    クラス RWCollectable から再定義した関数。

      virtual void
      clear() = 0;

    コレクションからすべてのオブジェクトを取り除きます。ただし、オブジェクト自身は削除しません。

      virtual void
      clearAndDestroy();

    コレクションからすべてのオブジェクトを取り除いて削除します。このとき、コレクション内の重複オブジェクトについては、1 つだけ削除します。複数のコレクション間で共有しているオブジェクトについては、このような配慮はしません。複数のコレクション間でオブジェクトを共有する場合はこの関数を使用しないか、またはオブジェクトを共有するコレクションを単一の "スーパーコレクション" に入れて `clearAndDestroy()` を呼び出してください。

      virtual int
      compareTo(const RWCollectable* a) const;

    クラス RWCollectable から継承した関数。

      virtual RWBoolean
      contains(const RWCollectable* target) const;

    コレクション内に仮想関数 `find()` が `NULL` 以外の値を返す項目があれば、`TRUE` を返します。

      virtual size_t
      entries() const = 0;

    コレクション内の項目総数を返します。

      virtual RWCollectable*
      find(const RWCollectable* target) const = 0;

    コレクション内の項目のうち `target` が指すオブジェクトと "一致する" 最初の項目へのポインタを返します。一致する項目がなければ `NULL` を返します。ほとんどのコレクションでは、コレクションの型に応じて `isEqual()` か `compareTo()` を使用し、等しいものが見つかれば、項目は `target` が指すオブジェクトに "一致する" ことになります。しかし、"アイデンティティコレクション" (RWIdentitySet と RWIdentityDictionary) では、同じアドレスを持つ項目を等しい項目とします。

      virtual unsigned
      hash() const;

    `RWCollectable` から継承した関数。

      virtual RWCollectable*
      insert(RWCollectable* e) = 0;

    項目をコレクションに追加し、そのポインタを返します。同じ項目がコレクション内にすでに存在すれば、RWCollection から派生したコレクションは前のインスタンスを返し、そうでなければ `NULL` を返します。

      virtual RWClassID
      isA() const;

    クラス RWCollectable から再定義した関数で、`__RWCOLLECTION` を返します。

      virtual RWBoolean
      isEmpty() const = 0;

    コレクションが空なら `TRUE` を、空でなければ `FALSE` を返します。

      virtual RWBoolean
      isEqual(const RWCollectable* a) const;

    クラス RWCollectable から継承した関数。

      virtual size_t
      occurrencesOf(const RWCollectable* t) const = 0;

    コレクション内の `t` と "一致する" 項目の数を返します。一致の定義は `find()` 関数を参照してください。

      virtual void
      restoreGuts(RWFile&);

    次の大域演算子を反復して呼び出すように再定義した関数。

          RWFile& operator>>(RWFile&, RWCollectable*&);

    コレクション内の各項目では、この後に `insert (RWCollectable*)` が続きます。

      virtual void
      restoreGuts(RWvistream&);

    次の大域演算子を反復して呼び出すように再定義した関数。

          RWvistream& operator>>(RWvistream&, RWCollectable*&);

    コレクション内の各項目では、この後に `insert (RWCollectable*)` が続きます。

      RWCollectable*
      remove(const RWCollectable* target) = 0;

    コレクション内の項目のうちオブジェクト `target` と "一致する" 最初の項目へのポインタを取り除き、それを返します。一致する項目がなければ `NULL` を返します。オブジェクトそのものは削除しません。

      virtual void
      removeAndDestroy(const RWCollectable* target);

    コレクション内の項目のうちオブジェクト `target` と "一致する" 最初の項目を取り除いて削除します。

      RWCollection*
      select(RWtestCollectable tst, void* x) const;

    コレクション内の各項目について、関数 `tst` を評価します。この関数が `TRUE` を返す項目を、自分自身と同じ型のヒープから割り当てた新しいコレクションに挿入し、そのコレクションへのポインタを返します。この新しいコレクションはヒープから割り当てたものなので、ユーザーが後でそれを削除する必要があります。これは仮想関数ではありません。

      virtual void
      saveGuts(RWFile&);

    コレクション内の各オブジェクトについて、次のような大域演算子を呼び出すように再定義した関数。

          RWFile& operator<<(RWFile&, const RWCollectable&);
      virtual void
      saveGuts(RWvostream&);

    コレクション内の各オブジェクトについて、次のような大域演算子を呼び出すように再定義した関数。

          RWvostream& operator<<(RWvostream&, const RWCollectable&);