Collections-C は、C 言語の汎用データ構造のライブラリです。
データをvoid*
の形式で保存する構造体。
容器 | 説明 |
---|---|
CC_Array | 要素が追加されると自動的に拡張される動的配列。 |
CC_List | 二重リンクリスト。 |
CC_SList | 単一リンクリスト。 |
CC_Deque | 両端での償却定数時間の挿入と削除、および定数時間のアクセスをサポートする動的配列。 |
CC_HashTable | 順序付けされていないキーと値のマップ。最良の場合の償却定数時間の値の挿入、削除、検索をサポートします。 |
CC_TreeTable | 順序付けされたキーと値のマップ。対数時間の値の挿入、削除、検索をサポートします。 |
CC_HashSet | 順序付けされていないセット。検索、削除、挿入は償却定数時間で実行され、最悪の場合は償却線形時間で実行されます。 |
CC_TreeSet | 注文したセットです。検索、削除、挿入は対数時間で実行されます。 |
CC_Queue | FIFO(先入れ先出し)構造です。一定時間の挿入、削除、検索をサポートします。 |
CC_Stack | LIFO (後入れ先出し) 構造。一定時間の挿入、削除、検索をサポートします。 |
CC_PQueue | 優先キュー。 |
CC_RingBuffer | リングバッファ。 |
CC_TSTTable | 三分探索ツリーテーブル。挿入、検索、反復、削除をサポートします。 |
int value = 20 ;
CC_Array * array ;
if ( cc_array_new ( & array ) != CC_OK ) { /*Create a new array.*/
// handle error
}
if ( cc_array_add ( & array , ( void * ) & value ) != CC_OK ) { /* Add the pointer to the value to the array */
// handle error
}
任意の長さのデータを直接格納する構造体。
容器 | 説明 |
---|---|
CC_ArraySized | 要素が追加されると自動的に拡張される動的配列。 |
int value = 20 ;
CC_SizedArray * array ;
if ( cc_sized_array_new ( sizeof ( int ), & array ) != CC_OK ) { /* Create a new array that stores values the size of an int*/
// handle error
}
if ( cc_sized_array_add ( & array , & value ) != CC_OK ) { /* Copy the value into the array */
// handle error
}
メモリ プールは、事前に割り当てられた連続メモリのブロックです。
容器 | 説明 |
---|---|
CC_DynamicPool | ヒープ上の、拡張可能なメモリ プール |
CC_StaticPool | 固定プール |
/* CC_StaticPool can enable the use of the structures on the stack */
#include "memory/cc_static_pool.h"
#include "cc_list.h"
CC_StaticPool * pool ;
// Alloc wrappers
void * pool_malloc ( size_t size ) { cc_static_pool_malloc ( size , pool );}
void * pool_calloc ( size_t count , size_t size ) { cc_static_pool_calloc ( count , size , pool );}
void pool_free ( void * ptr ) { cc_static_pool_free ( ptr , pool );}
int main ( int argc , char * * argv ) {
uint8_t buffer [ 2000 ]; /* Large enough buffer. */
cc_static_pool_new ( sizeof ( buffer ), 0 , buffer , buffer , & pool ); /* allocate the pool structure inside the buffer */
CC_ListConf conf ; /* Create a new list config */
cc_list_conf_init ( & conf );
conf . mem_alloc = pool_malloc ; /* Set list memory allocators to pool allocators */
conf . mem_calloc = pool_calloc ;
conf . mem_free = pool_free ;
CC_List * list ;
cc_list_new_conf ( & conf , & list ); /* The newly created list will be allocated inside the "buffer" array*/
// Use the list
return 0 ;
}
これらのパッケージは通常、ディストリビューション パッケージ マネージャーを通じてインストールできます。
プロジェクトをビルドするには、まず別のビルド ディレクトリを作成する必要があります (まだ存在しない場合)。
mkdir build
このディレクトリからcmake
コマンドを実行し、ビルドを構成できます。
cmake ..
またはcmake -DSHARED=True
使用して Collections-C を共有ライブラリとしてビルドしますcmake -DSHARED=False
静的ライブラリを構築しますcmake
よる makefile の生成が完了したら、ビルド ディレクトリ内でmake
実行してライブラリをビルドできます。
静的ライブラリのクローン作成と構築の例:
git clone https://github.com/Collections-C.git
cd Collections-C
mkdir build
cd build
cmake -DSHARED=False
make
( build
ディレクトリから) テストを実行するには:
make test
個々のテストを実行するには、適切な実行可能ファイルを実行するだけです。例えば:
build/test/array_test
ライブラリをインストールするには、次のコマンドを実行します。
sudo make install
デフォルトでは、ライブラリとヘッダーは/usr/local/lib/
および/usr/local/include
ディレクトリにインストールされます。
動的にリンクされたアプリケーションを実行できるようにするには、システムのランタイムに新しいライブラリの場所を認識させる必要があります。 /etc/ld.so.conf
にインストール ディレクトリが含まれている場合、これは次のコマンドを実行するのと同じくらい簡単です。
注: macOS は ldconfig をサポートしていません。
sudo ldconfig
すでにライブラリを構築してインストールしている場合は、単純な hello world プログラムを作成し、 hello.c
という名前のファイルに保存できます。
#include <stdio.h>
#include <collectc/cc_array.h>
int main ( int argc , char * * argv ) {
// Create a new array
CC_Array * ar ;
cc_array_new ( & ar );
// Add a string to the array
cc_array_add ( ar , "Hello World!n" );
// Retreive the string and print it
char * str ;
cc_array_get_at ( ar , 0 , ( void * ) & str );
printf ( "%s" , str );
return 0 ;
}
次に、プログラムをコンパイルしてリンクする必要があります。 make
静的ライブラリと動的ライブラリの両方を構築するため、どちらをプログラムにリンクするかを選択できます。
ライブラリをプログラムに静的にリンクしたい場合は、コンパイラに-static
フラグを渡すことができます。
注: macOS では、 -static
フラグはあまり使いやすいものではありません (すべてのライブラリが静的にリンクされている必要があります)。したがって、 -static -lcollectc
静的ライブラリへのフルパスに置き換えることができます。デフォルトでは/usr/local/lib/libcollectc.a
です。
gcc hello.c -static -lcollectc -o hello
または、clang でコンパイルする場合も同様に:
clang hello.c -static -lcollectc -o hello
これにより、ライブラリが実行可能ファイルにコピーされてリンクされます。 Collections-C を実行時の依存関係として持たせたくない場合は、このオプションを使用できますが、これにはより大きな実行可能ファイルが生成されるという犠牲が伴います。
実行時にライブラリと動的にリンクすることも選択できます。これは、 -static
コンパイラ フラグを省略した場合のデフォルトの動作です。
gcc hello.c -lcollectc -o hello
またはクランを使用して:
clang hello.c -lcollectc -o hello
動的にリンクすると、より小さい実行可能ファイルが生成されますが、プログラムが実行されるすべてのシステムにlibcollectc.so
存在する必要があります。
場合によっては、コンパイラがライブラリまたはヘッダーを見つけるのに問題が発生することがあります。これは通常、ライブラリまたはヘッダー、またはその両方が標準以外のディレクトリにインストールされているか、まったくインストールされていない場合に、間違ったディレクトリでそれらが検索されることが原因で発生します。
この場合、 -I[path to headers]
と-L[path to libraries]
オプションを渡すことで、コンパイラーにそれらを検索する場所を明示的に指示できます。
gcc hello.c `pkg-config --cflags --libs collectionc` -o hello
コンパイルがすべてうまくいった場合は、実行可能ファイルを実行できます。
./hello
Hello, World!
と表示されるはずです。コンソールに。
貢献は大歓迎です。
機能リクエストがある場合、またはバグを見つけた場合は、お気軽に新しい問題を開いてください。コードを貢献したい場合は、詳細について CONTRIBUTING.md を参照してください。