libral-圧縮ライブラリアクセスアブストラクションレイヤー

こんにちはHabr! 最近、GPL3ライセンスでオープンソースになったC / C ++ライブラリライブラリを紹介したいと思います。 おそらくそれは誰かに役立つでしょう。 このライブラリは、さまざまなロスレスデータ圧縮アルゴリズムへの単一のインターフェイスを提供します。

現在サポートされているライブラリは次のとおりです。





このライブラリを使用すると、さまざまな圧縮アルゴリズムを簡単に切り替えることができるため、最小限のコード変更でタスクに最適なアルゴリズムを選択できます。 以下のコードを使用して、ベンチマークを簡単に作成できます。

ライブラリは開発中であるため、安定性に期待する価値はありません。

APIは非常に単純です。 各圧縮ライブラリは、単一のインターフェースを持つドライバーによって記述されます。 現時点では(v0.1)ファイルI / O関数を介したアクセスはすべてのドライバーに実装されていませんが、compress()/ uncompress()は自信を持って使用できます。



struct file_driver_t{ fd_t *(* open)(const char *fname, int mode, void *params); int (* close)(fd_t *fd); off_t (* seek)(fd_t *fd, size_t offset, int whence); off_t (* tell)(fd_t *fd); size_t(* read)(fd_t *fd, char *buf, size_t size); size_t(* write)(fd_t *fd, char *buf, size_t size); int (* feof)(fd_t *fd); int (* ferror)(fd_t *fd); enum ral_status (* compress)(char *dest, size_t *destLen, const char *source, size_t sourceLen, void *param); enum ral_status (* uncompress)(char *dest, size_t *destLen, const char *source, size_t sourceLen, void *param); };
      
      





特定のドライバーを選択するには、get_driver関数を使用します。

 enum drivers_t {RAL_STDC, RAL_GZ, RAL_LZO, RAL_SNAPPY, RAL_BZIP, RAL_END}; struct file_driver_t *get_driver(enum drivers_t d);
      
      





使用例:

 #include <ral.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void fill_rand(char *buf, size_t size){ // we want to fill half, to show compression for(size_t i = 0; i < size / 2; i++){ buf[i] = (char)rand(); } } int main(){ static const size_t size_small = 1000000; // some drivers need more space to outbufer while compressing static const size_t size_big = 2*size_small; static char in[size_small]; static char tmp[size_big]; static char out[size_big]; // you can simply change drivers here struct file_driver_t *dr = get_driver(RAL_BZIP); if( dr == NULL || dr->compress == NULL || dr->uncompress == NULL ){ fprintf(stderr, "cant get driver\n"); return -1; } fill_rand(in, size_small); size_t tmp_len = size_big; if( dr->compress(tmp, &tmp_len, in, size_small, NULL) != RAL_OK ){ fprintf(stderr, "compress failed\n"); return -1; } printf("Compressed: in size: %ld out size: %ld\n", size_small, tmp_len); size_t out_len = size_big; if( dr->uncompress(out, &out_len, tmp, tmp_len, NULL) != RAL_OK ){ fprintf(stderr, "uncompress failed\n"); return -1; } if( out_len != size_small || memcmp(in, out, size_small) != 0 ) { fprintf(stderr, "Input and output differs\n"); return -1; } else { printf("Decompression ok\n"); } return 0; }
      
      





コメントや提案、特にファイルIO APIについての意見は特に興味深いものです。

ページ: github.com/artemg/ral

GIt:git://github.com/artemg/ral.git

targz: github.com/downloads/artemg/ral/libral-0.1.tar.gz



All Articles