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

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;

任意のコレクションを、RWBagRWSetRWOrdered、または 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 が指すオブジェクトに "一致する" ことになります。しかし、"アイデンティティコレクション" (RWIdentitySetRWIdentityDictionary) では、同じアドレスを持つ項目を等しい項目とします。

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&);