Tools.h++ 7.0 ユーザーズガイド: はじめに

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

# はじめに

## Tools.h++ の概要と機能

Tools.h++ は、充実した内容を持つ、強力で汎用性の高い C++ 基底クラスライブラリです。つまり、アプリケーションを実際に作成するために、セットになったソフトウェアパーツを使用できます。

Tools.h++ は、業界標準のひとつになっています。 Tools.h++ は、さまざまなコンパイラメーカーによって、それぞれのコンパイラに付属させる標準ライブラリとして選ばれています。このライブラリは、多数のコンパイラやオペレーティングシステムに移植され、世界中で使用されています。このため、プログラミングにどのような開発プラットフォームを選んでも、ほとんどの場合、Tools.h++ を使用することができます。

Tools.h++ のこの新バージョンは、標準の C++ ライブラリにもとづいて作成されています。このバージョンへの移行を容易にするために、Tools.h++ には使いやすいオブジェクト指向インタフェースと、信頼性の高い上方への移行手順が用意されています。Tools.h++ を使用すると、標準の C++ ライブラリの改版があるたびに、その版を組み込むことができます。

新しい Tools.h++ パッケージには、次のものが含まれています。

- 単一バイト文字、複数バイト文字、ワイド文字の強力なサポートクラス

  RWCString に完備された演算子と関数を使用すると、単一バイト文字列と複数バイト文字列を操作できます。また、クラス RWWstring を使用して、ワイド文字の列の操作をサポートできます。どちらのクラスも、連結、比較、インデックス付け (オプションで境界検査が可能)、入出力、大文字と小文字の変換、取り除き、他のさまざまな関数を簡単に実行することができます。クラス RWCSubString と RWWSubString は、部分文字列の抽出と代入をサポートします。クラス RWCRegexp と RWCRExpr は正規表現によるパターン検索をサポートします。クラス RWCTokenizer と RWWTokenizer は、それぞれ単一バイト文字列やワイド文字列をトークンに分割することができます。

  - 拡張正規表現

    文字列内の情報の検索に、前よりも高度なパターンマッチングツールを使用できます。新しい Tools.h++ の拡張正規表現機能は、ANSI/ISO 標準の POSIX.2 (ポータブルオペレーティングシステムインタフェース) の機能のサブセットから構成されています。この機能を使用するには標準 C++ ライブラリが必要です。

- 時間と日付を処理するクラス

  ある日付から別の日付までの日数や、ある日付が表す曜日を計算します。また、日数や時間を任意の書式で読み込んだり書き込んだりするなど、さまざまな処理を行なうことができます。Tools.h++ を使用すると、時間を簡単に操作できます。

- 国際化のサポート

  クラス RWLocale の便利で使いやすいフレームワークによってソフトウェアを国際化したり、クラス RWTimeZone を使用して時間帯と夏時間を操作したりできます。ライブラリ全体は 8 ビットクリーンであるため、任意の 8 ビット文字セットで使用することができます。埋め込みヌルは完全にサポートされています。

  - エンディアンストリーム

    バイナリストリームを活用して、オペレーティングシステム間で情報を交換することができます。エンディアンストリーム機構では情報の発生源であるオペレーティングシステムの記録を保持するため、ストリームを、システム固有のサイズやバイト順序に関係なくどのシステムでも読み取ることができます。

- マルチスレッド安全

  マルチスレッド安全機能を利用できます。マルチスレッドオプションを使用してライブラリをコンパイルすると、内部の完全性を維持するために十分な内部ロック能力を備えた、マルチスレッド安全システム機能が使用されます。

  - 持続記憶

    Tools.h++ のこのバージョンでは、現時点でも強力かつ高度な記憶機能がさらに強化されています。テンプレートにもとづいたコレクションを含むほとんどの Tools.h++ コレクションに、オブジェクトのポインタの関係を維持する同形持続性がサポートされています。同形持続性を独自のクラスに実装することもできます。RWCollectable から継承するオブジェクトには多相持続性があります。この機能を使用すると、これはポインタの関係を維持するだけでなく、オブジェクトの型を知らなくてもそれらのオブジェクトを復元できます。

  - テンプレートにもとづいたクラス

    標準 C++ ライブラリコンテナクラスにもとづいた、28 の新しいまたは再設計されたクラステンプレートがあります。開発環境で標準 C++ ライブラリをサポートしている場合は、これらのクラスへの完全なインタフェースを使用できます。標準 C++ ライブラリをサポートしていない場合、Tools.h++ は、同じインタフェースのサブセットを使用して、テンプレートにもとづいたクラスを提供します。

- 総称コレクションクラス

  まだテンプレートをサポートしていないコンパイラに対応できるよう、Tools.h++ には、C++ プリプロセッサ (前処理系) と `<generic.h>` (ほとんどのコンパイラに付属しているヘッダファイル) を使用するテンプレートと同様のクラスセットが用意されています。これらの総称クラスに対するインタフェースは、テンプレートにもとづいたクラスと類似しているため、簡単に移行を行なうことができます。

- Smalltalk 式コレクションクラス

  Smalltalk-80 プログラミング環境以降にモデル化されたコレクションクラスの完全なライブラリで、Set、Bag、Queue、Stack、OrderedCollection、SortedCollection、Dictionary などが含まれています。

- その他の機能：RWFile クラスは標準のファイル操作をカプセル化します。B ツリーディスク検索では、B ツリーを使用して、効率的なディスクレコードへのキーによるアクセスを行ないます。ファイル領域マネージャは、ファイル内での空き領域の割り当て、開放、合体を行ないます。完璧なエラー処理機能は、可能であれば C++ 例外を利用します。ビットベクトル、仮想入出力ストリーム、キャッシュマネージャ、仮想配列を含むさらに多くのクラスがあります。

## Tools.h++ と C++ の方針

C++ に精通していれば、Tools.h++ を容易に使用できます。C++ クラスライブラリと同様に、Tools.h++ も C++ 言語そのものと多くの共通の設計目標があります。これらの目標には次のものがあります。

- 効率。通常、Tools.h++ では、ある機能を使用しないと、性能が低下するということはありません。コンパイル時には、静的なデータ型検査という C++ の方針に合わせて、できるだけ多くの決定を行なっています。ほとんどの場合、非常に単純ではあるが一般性の低いクラスか、複雑で一般性の高いクラスのどちらかを選択できます。

- 単純さ。単純さを維持するために、Tools.h++ ではサブクラスをほとんど使用していません。アーキテクチャ全体は複雑に統合されていますが、各クラスは通常、明確に定義された 1 つの役割だけを果たします。関数もほとんどが、単純で、ほんの数行のコードからできています。新しい機能はわずか追加しただけで、すでにある機能については何も手を加えてありません。

- 簡潔さ。C++ と同様、Tools.h++ も、コンパイルされたプログラムを小さくするということを目標としています。これは、組み込み型システムでプログラムを使用するうえで重要な目標です。テンプレートには、この点に関してさまざまな効果があります。つまり、簡潔なソースコードを作成できますが、コンパイル時の簡潔さが犠牲になることが往々にしてあります。

- 予測可能性。よく知られている演算子は予測どおりに機能し、意外な動きや難解な多重定義の演算子はありません。また、Tools.h++ は非常に均整がとれているので、たとえば、Dictionary の実装方法をハッシュテーブルから B ツリーへ問題なく変更することができます。

## Tools.h++ と C++ の標準化

C++ 言語と標準 C++ ライブラリの標準化による利点は誰の目にも明らかなものです。ただし、この標準化の過程でも、業務を続けられるようにする必要があります。この過程を移行期間といい、C++ コミュニティは現在この期間にあります。

移行では、標準は完成に近づいていますが、まだ完全には安定していません。標準そのものが実質的に改訂される可能性はまずありませんが、1997 年まで細かな調整と認可が続きます。

また、移行では、コンパイラは標準に向けてさまざまな段階を追って進化します。当分の間、名前空間、省略時のテンプレート引数、メンバー関数テンプレート、入れ子のクラステンプレートなどの新しい言語機能が、コンパイラによってサポートされていたり、サポートされていなかったりします。一部のコンパイラが、標準 C++ ライブラリのあるバージョンを組み込んでいない可能性もあります。必要な言語機能をサポートするかぎりにおいてのみ、標準に準拠するバージョンが多数出てくるでしょう。市販のコンパイラが実際に正確な C++ 言語を実装するか、標準の記述どおりに標準 C++ ライブラリを組み込むようになるまでには、かなりの時間がかかるはずです。

最後に、移行期間中の開発者の状況を説明します。開発者は将来の標準に向けて設計と実装の改良を担当します。変更は、開発環境、アプリケーションの領域、企業の性格による評価に従って行われます。

Tools.h++ の目標は、最新の C++ の技術に合わせて独自のペースで移行しながら開発を行なうときに、その一貫性を保つことにあります。

## 標準の利用

Tools.h++ の新しいバージョンでは、ANSI/ISO 標準の C++ ライブラリとの関係を確立することを第一の課題としています。Rogue Wave は、製品を標準に準拠させるだけでなく、その機能をフル活用することにも関与しています。目標は、さらに便利で有能なクラスライブラリの提供です。弊社のライブラリを C++ 標準に統合させる作業は、この Tools.h++ バージョン 7 から始まっています。

Tools.h++ のこのバージョンでは、STL または標準テンプレートライブラリと通常呼ばれる標準 C++ ライブラリのコンテナとの統合に力を注ぎました。各標準コンテナは、新しいまたは再設計された Tools.h++ コレクションクラステンプレートの中に含まれています。テンプレートの詳細については、第 10 章「コレクションクラステンプレート」を参照してください。次に、Tools.h++ と標準 C++ ライブラリの統合の主な設計目標を、それらがこのバージョンでどのように反映されているかを示す例とともに示します。

- 設計目標：効果

  標準 C++ ライブラリを活用して基本の C++ 言語よりも高度な基礎を作成することによって効果を上げる。

  たとえば、Tools.h++ は、標準 C++ ライブラリコンテナを実装に使用するコレクションを提供します。Tools.h++ を標準にもとづいて作成すると、これらのコレクションで簡単に標準の反復子を提供することができます。これにより、高度な標準 C++ ライブラリアルゴリズムでこれらのコレクションを使用できるようになります。それと同時に、Tools.h++ コレクションが常に提供してきた、安全で使いやすいオブジェクト指向インタフェースを維持することもできます。

- 設計目標：相互運用性

  C++ 標準の主要な利点をサポートして、さまざまなメーカーが提供するライブラリ、モジュール、クラス、アルゴリズムを、相互に高レベルで簡単に運用できるようにする。

  たとえば、標準 C++ ライブラリのリストが予期される場所に、Tools.h++ のダブルリンクされたリストを安全かつ効率的に渡すことが確実にできるようにしました。

- 設計目標：自由度

  標準 C++ ライブラリへのアクセスを維持する。

  たとえば、標準 C++ ライブラリコンテナによって実装された Tools.h++ コレクションを使用する場合は、いつでも任意に標準 C++ ライブラリの非オブジェクト指向機能を利用できるように、より低いレベルの実装へ書き直すことが可能です。

- 設計目標：オブジェクト指向

  標準 C++ ライブラリを高機能なオブジェクト指向のインタフェースによって強化する。

  再設計された新しいコレクションクラステンプレートはすべて、この目標を実現しています。どちらの場合も、対応する標準 C++ ライブラリコンテナに効果的なラッパーを挿入して、使いやすく、しかも強化された Tools.h++ コレクションインタフェースを提供します。

- 設計目標：単純さと安全性

  標準 C++ ライブラリをより単純なインタフェースによって強化して、危険性を減らし、クライアントコードの保守を容易にする。

  オブジェクト指向インタフェースがこの目標の実現を助けます。標準 C++ ライブラリと違って、Tools.h++ コンテナメソッドは、制御対象のデータを知っているため、ユーザーは反復子とアルゴリズムを指定する必要がありません。

- 設計目標：互換性

  Tools.h++ の旧バージョンで書かれたコードに対するユーザーの投資を保護する。

  たとえば、Tools.h++ のバージョン 6.1 のコレクションクラステンプレートは、標準の C++ ライブラリコンテナにもとづいて再設計してあります。ほとんどすべての場合、ライブラリの旧バージョンでクラスを使用していた既存のソースコードは、そのままコンパイルして、新しいライブラリとともに利用できます。

- 設計目標：円滑な移行

  開発者に対して、標準 C++ に向けての移行をほとんど混乱することなく行なうための手段を提供する。

  たとえば、Tools.h++ は、標準 C++ ライブラリがあってもなくても使用できます。開発環境で Tools.h++ との使用を保証された標準 C++ ライブラリのバージョンをサポートしている場合は、標準 C++ ライブラリコンテナクラスを使用して実装された 28 の新しいまたは再設計されたクラステンプレートを提供します。標準 C++ ライブラリをサポートしていない場合は、Tools.h++ の旧バージョンの技術を使用して実装された多数の同じクラステンプレートへの部分的なインタフェースを提供します。コンパイル時に適切な実装が自動的、透過的に選択されます。より制限されたインタフェースをコーディングすれば、標準 C++ ライブラリが使用可能になると同時に、このライブラリを活用できます。

### このバージョンでは加えられていない機能

Tools.h++ の今後のバージョンでは、標準 C++ ライブラリと C++ 言語の新しく追加された機能を全面的に利用する予定です。しかし、このバージョンでは、最新技術の導入を保留することに決定した領域がいくつかあります。これには、標準ライブラリまたは言語機能が今よりも広く使用されるようになるまで待つことにした場合があります。また、率直に言えば、新しい機能について十分な経験をつんで、それらを統一した効率的な構築を行なうという、最善の方法を判断できるようになるまで待つことにした場合もあります。弊社では、弊社自身やユーザーが不便を被ることにならないよう慎重に開発を進めていきたいと考えています。しばらくの間は、以下の点に注意してください。

- RWCString と RWWString

  Tools.h++

  は、クラス RWCString と RWWString を引き続き使用します。これらのクラスは、その部分文字列クラスと、共同で動作する正規表現クラスとトークナイザクラスとともに、長い間、ライブラリの最も便利で強力なツールと考えられてきました。この機能群は、標準 C++ ライブラリでは提供されません。C++ 標準の string と wstring はアプリケーションで使用できますが、Tools.h++ と標準の文字列の間で変換を行なわなければならない場合、コピーによるオーバーヘッドが起こる可能性があります。

- RWLocale

  Tools.h++

  は、クラス RWLocale を引き続き使用します。このリリースの時点では、C++ 標準ロケールクラス仕様は、ANSI/ISO 標準委員会により検討中です。

- 例外階層

  Tools.h++ は、独自の例外階層を引き続き使用します。これは、C++ 標準草案の例外階層に似ています。標準の例外階層がより広く使用可能になるまで、切り替えは考えていません。標準の例外をアプリケーションで使用することはできますが、各自の try ブロックから Tools.h++ ライブラリへ呼び出しを行うときに Tools.h++ の例外も捕獲できるようにしておく必要があります。

- 名前空間

  Tools.h++ では、現在の草案で指定された名前空間を使用していません。現在のところ、RW 接頭辞を引き続き使用して、大域名前空間内のクラスを識別します。コンパイラで可能であれば、このことが、アプリケーションでの名前空間の使用を妨げることはありません。

## お読みになる前に

このマニュアルは、Tools.h++、Rogue Wave の基底クラスライブラリの使用方法を説明しています。ここでは、読者が C++ に詳しいことを前提としています。C++ をよく知らない場合は、付録 D「参考文献」で必要な資料を探すことができます。

C++ の上級ユーザーの場合は、Stroustrup [1991]、Lippman [1991]、または Ellis and Stroustrup [1990] とともにこのマニュアルを読むことができます。後者は、「ARM (the Annotated Reference Manual)」と呼ばれます。これらの資料の簡潔で正確な説明は、この言語を学ぶうえで非常に参考になります。(この 2 冊には日本語訳があります。付録 D 参照)

### 表記上の規則

このマニュアルを読むときは、次の特殊な規則に注意してください。

- クーリエフォント - ディスクディレクトリ、ファイル名、例、オペレーティングシステムのコマンド、関数名、コード、コードの一部分 (たとえば、`RWTPtrHashSet<int RWDefHArgs (int)> hset;`,`deque<T>`,`isEqual` など) に使用します。ほとんどの関数名は小文字で始まりますが、後続の単語は大文字で始まります (`compareTo()` など)。

- ボールドサンセリフ斜体 - クラス (RWCollectable または RWCString など) に使用します。ほとんどの Rogue Wave クラスには接頭辞 RW が付きますが、これは強調されません。クラス名は、そのクラスの機能を示し、Rogue Wave クラスを、総称的に命名された他のベンダーのクラスから識別します (たとえば、ただの Iterator ではなく RWIterator)。クラス名は大文字で始まります。

- サンセリフ斜体 - Rogue Wave の製品名 (たとえば、Tools.h++)に使用します。

- 斜体またはボールド (例 italic または bold) - 強調や特殊な用語など従来の使用法。

- 縦に並んだ点線 - コードの例では、コードの一部が省略されていることを示します。

          main()
          {
          .
          .   // 何かが起こる
          .
          }

このマニュアルでは、次のような字体や記号を特別な意味を持つものとして使用します。

#### 表 P-1 表記上の規則

字体または記号 | 意味 | 例
--- | --- | ---
`AaBbCc123` | コマンド名、ファイル名およびディレクトリ名を示します。または、画面上のコンピュータ出力を示します。 | `.login` ファイルを編集します。`ls -a` を使用してすべてのファイルを表示します。 `system%`
`AaBbCc123` | ユーザが入力する文字を、画面上のコンピュータ出力とは区別して示します。 | `system% su` `password:`
AaBbCc123 | 変数を示します。実際に使用する特定の名前または値で置き換えます。 | ファイルを削除するには、`rm` filename と入力します。
『 』 | 参照する書名を示します。 | 『コードマネージャ・ユーザーズガイド』を参照してください。
「 」 | 参照する章、節を示します。また、ボタンやメニューなど、強調する単語を囲む場合にも使用します。 | 第 5 章「衝突の回避」を参照してください。
| 手順の 1 ステップを示します。 | 適用ボタンをクリックします。
| 階層メニューのサブメニューを選択することを示します。 | 作成: 「返信」 「送信者へ」

コード例はボックスで囲んで示します。たとえば、次のように表示されます。

- C シェルプロンプト

      system%

- Bourne シェルおよび korn シェルのプロンプト

      system$

- スーパーユーザのプロンプト

      system#