[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4. サポートクラス

定義済みユニットの実装にはいくつかのサポートクラスが使用されている。サ ポートクラスはISIS内部だけでなく、ISIS外部でも使用できるような一般的な クラスライブラリである。

現在、以下のサポートクラスが実装されている。

4.1 root_objectクラス  
4.2 c_arrayクラス  
4.3 bitvectorクラス  
4.4 cyclic_queueクラス  
4.5 limited_counterクラス  
4.6 argument_parserクラス  
4.7 gdb_portクラス  


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 root_objectクラス

root_objectクラスは抽象クラスであり、その派生クラスに対してオブ ジェクトの複製、ストリーム入出力機能、不変式チェックのインタフェースを 規定する働きを持つ。このクラスを基底クラスとしてクラス階層を形成するこ とで、クラス階層内でのオブジェクトの複製やストリーム入出力などについて のインタフェースを統一することができる。ISISのハードウェアユニットは root_objectクラスの提供するインタフェースを通じてオブジェクトの 複製やストリーム入出力を行う場合が多い。

root_objectクラスは以下の純粋仮想関数及び仮想関数を持つ。具体派 生クラスは全ての純粋仮想関数に定義を与える必要がある。また、必要があれ ばその他の仮想関数に定義を与えることができる。

int check_invariant(void) const
オブジェクトの不変式の正当性をチェックする関数。不変式が正当であれば真 を返す。データメンバを持つ派生クラスでこの仮想関数に新しい定義を与える ことにより、不変式のチェック機能を再定義できる。

root_object* new_object(void) const
同じ型のオブジェクトを生成し、そのポインタを返す関数。純粋仮想関数であ る。この関数を用いることにより、オブジェクトの正確な型を把握しないまま に全く同じ型のオブジェクトを生成することができる。この関数を用いる場合 は、具体派生クラスでデフォルトコンストラクタを定義し、さらに以下の定義 を行うこと。

 
derived_class : public root_object
{
public:
    virtual root_object* new_object(void) const;
};

root_object* derived_class::new_object(void) const
{
    return new derived_class;
}

root_object* clone_object(void) const
同じ型のオブジェクトを生成し、自分自身の値をコピーして、そのポインタを 返す関数。純粋仮想関数である。この関数を用いることにより、オブジェクト の正確な型を把握しないままに全く同じ型、同じ値のオブジェクトを生成する ことができる。この関数を用いる場合は、具体派生クラスでコピーコンストラ クタを定義し、さらに以下の定義を行うこと。

 
derived_class : public root_object
{
public:
    virtual root_object* new_object(void) const;
};

root_object* derived_class::new_object(void) const
{
    return new derived_class(*this);
}

void input(istream&)
入力ストリームからオブジェクトへデータを入力するための関数。入力ストリー ムからの入力演算子関数は実際にはこの仮想関数呼出しとして実装されている ため、この関数の新しい定義を与えることでストリーム入力の実装を変更する ことができる。

void output(ostream&) const
出力ストリームへのオブジェクトのデータを出力するための関数。出力ストリー ムへの出力演算子関数は実際にはこの仮想関数呼出しとして実装されているた め、この関数の新しい定義を与えることでストリーム出力の実装を変更するこ とができる。

root_objectを仮想基底クラスとした場合、new_object関数、 clone_object関数は使用できない。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 c_arrayクラス

指定された型のオブジェクトを配列状に格納するコンテナクラスである。ほぼ STLのvectorクラスと互換のインタフェースを持つが、配列サイズは固 定である。実行時コストは組み込み配列と等価である。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 bitvectorクラス

bool型の要素を配列状に格納するコンテナクラスである。ほぼSTLの bitsetクラスと互換のインタフェースを持つが、配列サイズは可変で ある。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 cyclic_queueクラス

指定された型のオブジェクトを配列状に格納する待ち行列のコンテナクラスで ある。ほぼSTLのqueueクラスと互換のインタフェースを持つ。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 limited_counterクラス

ある限定された範囲の値をとるカウンタを表すクラス。値の型をパラメータと するテンプレートクラスである。値の操作はインクリメント、デクリメントの みを行うことができる。カウンタの最小値は0で、最大値は任意の正の整数を 設定する。指定しなければ1である。++--演算子もサポート されている。

value_type max(void) const
カウンタの値の最大値を返す。

value_type value(void) const
現在のカウンタの値を返す。

bool is_max(void) const
値が最大値かどうかを判定する。

const limited_counter& increment(void)
カウンタの値を1増加させる。値が最大値に達している場合は何もしない。操 作を行った後の値を返す。

const limited_counter& declement(void)
カウンタの値を1増加させる。値が最大値に達している場合は何もしない。操 作を行った後の値を返す。

void clear(void)
カウンタの値を0にする。

void set_max(value_type)
カウンタの値の最大値を設定し、設定後の最大値を返す。

bool check_invariant(void) const
不変式をチェックする。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.6 argument_parserクラス

コマンドライン引数を解釈し、参照しやすいデータベースを作成するクラス。 `-<char>'`-<char><value>'`--<str>'`--<str>=<value>' の4つの形式のオプションをサポートする。オプショ ンおよび非オプションはどのような順序で記述されていても構わない。すべて のオプションがデータベースに登録され、非オプションはmain関数の 第二引数と同様の形式の文字列の配列としてまとめて登録される。例外として、 コマンドライン中に--が指定されていた場合には、それ以降の引数が すべて非オプションとして取り扱われる。

`-<char>'`--<str>'は真または偽のブール値、 `-<char><value>'`--<str>=<value>'は文字列値を持つ。ブー ル値が真かどうかを参照するにはdefinedメンバ関数、文字列値の参照 には[]演算子を用いる。それぞれ、`-<char>'形式の値を見る 場合には文字型、`--<str>'形式の値を見る場合には文字列をキーとし て渡す。defined関数は真または偽を返す。[]演算子は値が定 義されていれば文字列値を、値が未定義であればNULLを返す。

コマンドライン引数の入力は、コンストラクタの引数もしくはsetメン バ関数で行う。通常はmain関数の第二引数argvに1を加えた値 を渡すと良い。こうすることで、そのプログラム自身を示す文字列以外のコマ ンドライン引数をデータベース化させることができる。

以下に簡単な例を示す。この例では、`-c'で総クロック数の出力、 `-p<n>'でプロセッサ数指定、`--verbose'で冗長出力、 `--stdout=<file>'で標準出力ファイルを指定できるように設定してい る。

 
int main(int, char** argv)
{
    bool clock_flag = false, verbose_flag = false, punum = true;
    char* stdout_filename = NULL;
    argument_parser arg(argv + 1);
    if (arg.defined('c')) clock_flag = true;
    if (arg['p'] != NULL) punum = atoi(arg['p']);
    if (arg.defined("verbose")) verbose_flag = true;
    if (arg["stdout"] != NULL) stdout_filename = arg["stdout"];
    /* ... */
}

void set(const char* const)
コマンドライン引数を設定する。

void clear(void)
設定されたコマンドライン引数を消去する。

bool defined(char) const
指定された文字の`-<char>'形式のオプションが設定されていれば真を 返す。

bool defined(const char*) const
指定された文字列の`--<string>'形式のオプションが設定されていれ ば真を返す。

const char* operator[](char) const
指定された文字の`-<char><value>'形式のオプションの値を返す。

const char* operator[](const char*) const
指定された文字列の`--<string>=<value>'形式のオプションの値を返 す。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.7 gdb_portクラス

gdbとの通信を処理するクラス。TCPおよびUDPによる通信、パケットのエンコー ドとデコードをサポートする。通信はsendreceiveメンバ関 数のみで行う。パケットを送信した時のアクノリッジの受信、パケットを受信 した時のアクノリッジの送信は自動で行われる。

  1. TCP/UDPの設定。use_tcpまたはuse_udpでプロトコルを設定す る。

  2. ポート番号の設定。set_portでポート番号を設定する。

  3. 初期化。setupで初期設定を行う。戻り値が真ならば初期化成功。

  4. 接続。TCPを用いる場合はconnectでクライアントからの接続を待つ。

  5. 実際の通信。sendおよびreceiveで通信を行う。

  6. 切断。TCPを用いる場合はdisconnectで通信路を切断する。

  7. 終了。shutdownで終了する。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Masaki WAKABAYASHI on September, 3 2003 using texi2html