メインページ | ネームスペース一覧 | クラス階層 | 構成 | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ | 関連ページ

static_container

概要

STL コンテナが登場し、利用者が直接面倒なメモリの動的確保をすることなく、各種のコンテナを利用することが可能になった。だが、MMU の存在しないハードウェアに対してのプログラム ( 多くの場合、組み込み系のプログラム ) においては、メモリの断片化が現在においても問題であり、メモリの動的確保を無秩序に行われると、その解決が困難となる。そのため、頻繁に動的確保を行う STL コンテナの利用は組み込み分野では倦厭されることが多い。その解決のため、様々な方法が試行されているが、今もって完全な解決には至っていない。本ライブラリ static_container は、動的確保を一切行わず、静的確保によって STL 互換コンテナを実現することを目的としている。また、仮想関数などもで極力使用していないため、vector, string はそのままバイナリファイルに書き出し、読み込むことが可能である。

方針

  1. 動的確保は一切使わない
  2. 仮想関数もできるだけ使用しない
  3. 全てのコンテナが、ふたを開ければ「ただの配列」
  4. 例外を投げず、アサートでの異常感知

ベクター

参照:
static_container::vector
std::vector の下位互換コンテナ(上位互換を目指している)。最大サイズを指定する。

#include <static_container/vector.h> using namespace static_container; vector< int, 10 > c; // int のベクター ( 最大サイズ 10 ) c.max_size(); // = 10 c.size(); // = 0 c.push_back( 5 ); // 5 を末尾に挿入 c.size(); // = 1 c.pop_back(); // 削除 c.size(); // = 0

現在、4バイトアラインにしか対応していない。

リスト

参照:
static_container::list
std::list の下位互換コンテナ(上位互換を目指している)。最大サイズを指定する。

#include <static_container/list.h> using namespace static_container; list< int, 10 > c; // int のリスト ( 最大サイズ 10 ) c.max_size(); // = 10 c.size(); // = 0 c.push_back( 5 ); // 5 を末尾に挿入 c.size(); // = 1 c.pop_back(); // 削除 c.size(); // = 0

vector と違い、こいつはアライン問題は、大丈夫だと思う。

間借りリスト

参照:
static_container::lodge_list

static_container::list_node_pool

list を分解し、ノードプールと、リストに切り分けた。管理側で大きなノードプールを用意し、複数のサブシステムがそのノードプールを共有して使いまわしていくために作られた。

#include <static_container/lodge_list.h> void test_lodge_list() { list_node_pool< int, 10 > pool; lodge_list< int > list0( pool ); lodge_list< int > list1( pool ); lodge_list< int > list2( pool ); pool.rest(); // = 10 初期状態では、10 個余っています list0.push_back( 100 ); // 100 を list0 に挿入 pool.rest(); // = 9 一つ減ります list0.front(); // = 100 もちろん、back も 100 になります }

現在、もっと良い名前を募集中!

文字列

参照:
static_container::string
std::string の下位互換コンテナ(上位互換を目指している)。最大サイズを指定する。最大サイズが異なるコンテナ同士の演算もサポートしている。

#include <static_container/string.h> using namespace static_container; string< 10 > c; // 最大サイズ 10 の文字列 c.max_size(); // = 10 c.size(); // = 0 c.length(); // = 0 ( size() と同じ ) c.push_back( 5 ); // 5 を末尾に挿入 c.size(); // = 1 c.pop_back(); // 削除 c.size(); // = 0 "" == c; // = true ( C 文字列との比較 ) c < "a"; // = true ( C 文字列との辞書順比較 ) c = "hello"; // 文字列の代入 string< 100 > c100( c ); // 別の型への代入 c100 = c; c100 += c; c100.append( c );

ハッシュ

参照:
static_container::hash

static_container::list_hash

std::map の下位互換コンテナ。std::map との大きな違いは、

である。多くの場合、hash は list と組み合わせて使われることを想定しているため、最初からそれを組み合わせた list_hash というものも存在する。ほとんどの場合は、これを利用していれば、大きな問題に出会うことも無いであろう。

typedef list_hash< int, int, 10 > int_hash; int_hash ihash; ihash[ 0 ] = 100; ihash[ 5 ] = 20; ihash.size(); // = 2 ihash[ 0 ]; // = 100 ihash[ 5 ]; // = 20 ihash[ 5 ] = 30; 30 == ihash[ 5 ]; // = 30 ihash.size(); // = 2 すでにキーが存在する場合は、サイズが増えない

今後の方向性

ディレクトリ構成

動作確認環境

このライブラリは、boost に依存しています。

ライセンス

修正 BSD です。日本語の簡単な解説は、以下の URL が参考になるでしょう。

http://e-words.jp/w/BSDE383A9E382A4E382BBE383B3E382B9.html

作者への報告があれば、当然喜びますし、より良いライブラリになるでしょう。ただ、報告がなくても、商用利用してかまいませんし、改変をしてもかまいません。

作者に関して

このライブラリ作成にあたって、会社の仲間 ( http://www.pyramid-inc.net/ ) にお世話になりました。謝辞を述べさせていただきます。


static_containerに対してSat Jun 19 11:30:58 2004に生成されました。 doxygen 1.3.6