/* -*- Mode: C++ ; Coding: euc-japan -*- */
/* Time-stamp: <2013-06-05 11:24:24 cyamauch> */
#ifndef _SLI__ASARRAY_TSTRING_H
#define _SLI__ASARRAY_TSTRING_H 1
/**
* @file asarray_tstring.h
* @brief 文字列の連想配列を扱う asarray_tstring クラスのヘッダファイル
*/
#include "sli_config.h"
#include "tarray_tstring.h"
#include "ctindex.h"
namespace sli
{
/*
* sli::asarray_tstring class manages an associative string array in object,
* and provides a lot of useful member functions to process associative array.
*/
/**
* @class sli::asarray_tstring
* @brief 文字列の連想配列を扱うためのクラス
*
* asarray_tstring は文字列の連想配列を扱うためのクラスで,tstring クラスと
* 同様,スクリプト言語のような強力な文字列処理用 API を提供します.下記の
* ような機能を持ちます.
* - 値のセット,追加,挿入等で printf() の記法が使える API
* - 要素単位のアクセス
* - 左右の空白,改行文字の除去
* - 文字列のデリミタでの分割
* - 正規表現による置換
* - キー文字列,要素文字列に対するポインタ配列の取得
*
* @note オブジェクト内部では,文字列は単純な配列として保存されます.同時に,
* キー文字列と配列番号との関係も保存され,それには ctindex クラスを用い
* ています.ctindex クラスはキー文字列と配列番号との関係を,「木」構造
* で記録し,高速な検索(キー文字列から配列番号への変換)を可能にしていま
* す.ただし,「木」構造ですので,更新にはやや時間がかかります.
* @note 内部のバッファは 1Gbyte 未満では 2^n 単位で確保されるため,かなり
* 頻繁な更新処理に対しても十分なパフォーマンスが得られるでしょう.
* @author Chisato YAMAUCHI
* @date 2013-04-01 00:00:00
*/
typedef struct {
const char *key;
const char *value;
} asarrdef_tstring;
class asarray_tstring
{
public:
/* constructor and destructor */
asarray_tstring();
asarray_tstring(const asarrdef_tstring elements[]);
asarray_tstring(const char *key0, const char *val0,
const char *key1, ...); /* 要NULL終端 */
asarray_tstring(const asarray_tstring &obj);
virtual ~asarray_tstring();
/*
* operator
*/
/* same as .init(obj) */
virtual asarray_tstring &operator=(const asarray_tstring &obj);
/* same as .at(key) */
virtual tstring &operator[]( const char *key );
virtual const tstring &operator[]( const char *key ) const;
/*
* member functions
*/
/* complete initialization of objects */
virtual asarray_tstring &init();
virtual asarray_tstring &init(const asarray_tstring &obj);
/* clean() member functions pads all the element values of an existing */
/* associative array with any string. */
virtual asarray_tstring &clean(const char *str = "");
virtual asarray_tstring &clean(const tstring &str);
/* set an associative string array */
virtual asarray_tstring &assign( const asarray_tstring &src );
virtual asarray_tstring &assign( const asarrdef_tstring elements[] );
virtual asarray_tstring &assign( const asarrdef_tstring elements[],
size_t n );
virtual asarray_tstring &assign( const char *key, const char *val );
virtual asarray_tstring &assign( const char *key, const tstring &val );
virtual asarray_tstring &assignf( const char *key, const char *fmt, ... );
virtual asarray_tstring &vassignf( const char *key,
const char *fmt, va_list ap );
virtual asarray_tstring &assign( const char *key0, const char *val0,
const char *key1, ... );
virtual asarray_tstring &vassign( const char *key0, const char *val0,
const char *key1, va_list ap );
/* set multiple strings or a string array to keys */
virtual asarray_tstring &assign_keys( const char *key0, ... );
virtual asarray_tstring &vassign_keys( const char *key0, va_list ap );
virtual asarray_tstring &assign_keys( const char *const *keys );
virtual asarray_tstring &assign_keys( const tarray_tstring &keys );
/* divide strings and sets them to keys */
virtual asarray_tstring &split_keys( const char *src_str,
const char *delims,
bool zero_str, const char *quotations,
int escape, bool rm_escape );
virtual asarray_tstring &split_keys( const char *src_str,
const char *delims,
bool zero_str = false );
virtual asarray_tstring &split_keys( const tstring &src_str,
const char *delims,
bool zero_str, const char *quotations,
int escape, bool rm_escape );
virtual asarray_tstring &split_keys( const tstring &src_str,
const char *delims,
bool zero_str = false );
/* set multiple strings or a string array to values */
virtual asarray_tstring &assign_values( const char *val0, ... );
virtual asarray_tstring &vassign_values( const char *val0, va_list ap );
virtual asarray_tstring &assign_values( const char *const *values );
virtual asarray_tstring &assign_values( const tarray_tstring &values );
/* divide strings and sets them to values */
virtual asarray_tstring &split_values( const char *src_str,
const char *delims,
bool zero_str, const char *quotations,
int escape, bool rm_escape );
virtual asarray_tstring &split_values( const char *src_str,
const char *delims,
bool zero_str = false );
virtual asarray_tstring &split_values( const tstring &src_str,
const char *delims,
bool zero_str, const char *quotations,
int escape, bool rm_escape );
virtual asarray_tstring &split_values( const tstring &src_str,
const char *delims,
bool zero_str = false );
/* add elements */
virtual asarray_tstring &append( const asarray_tstring &src );
virtual asarray_tstring &append( const asarrdef_tstring elements[] );
virtual asarray_tstring &append( const asarrdef_tstring elements[],
size_t n );
virtual asarray_tstring &append( const char *key, const char *val );
virtual asarray_tstring &append( const char *key, const tstring &val );
virtual asarray_tstring &appendf( const char *key, const char *fmt, ... );
virtual asarray_tstring &vappendf( const char *key,
const char *fmt, va_list ap );
virtual asarray_tstring &append( const char *key0, const char *val0,
const char *key1, ... );
virtual asarray_tstring &vappend( const char *key0, const char *val0,
const char *key1, va_list ap );
/* insert elements */
virtual asarray_tstring &insert( const char *key,
const asarray_tstring &src );
virtual asarray_tstring &insert( const char *key,
const asarrdef_tstring elements[] );
virtual asarray_tstring &insert( const char *key,
const asarrdef_tstring elements[],
size_t n );
virtual asarray_tstring &insert( const char *key,
const char *newkey, const char *newval );
virtual asarray_tstring &insert( const char *key,
const char *newkey, const tstring &newval );
virtual asarray_tstring &insertf( const char *key,
const char *newkey,
const char *fmt, ... );
virtual asarray_tstring &vinsertf( const char *key,
const char *newkey,
const char *fmt, va_list ap );
virtual asarray_tstring &insert( const char *key,
const char *key0, const char *val0,
const char *key1, ... );
virtual asarray_tstring &vinsert( const char *key,
const char *key0, const char *val0,
const char *key1, va_list ap );
/* deletes elements */
virtual asarray_tstring &erase();
virtual asarray_tstring &erase( const char *key, size_t num_elements = 1 );
/* interchanges objects */
virtual asarray_tstring &swap( asarray_tstring &sobj );
/* changes of key strings */
virtual asarray_tstring &rename_a_key( const char *org_key,
const char *new_key );
/* すべての文字列要素に対する編集 */
/* string search and replacement of all the elements */
virtual asarray_tstring &strreplace( const char *org_str,
const char *new_str,
bool all = false );
virtual asarray_tstring &strreplace( const tstring &org_str,
const char *new_str,
bool all = false );
virtual asarray_tstring &strreplace( const char *org_str,
const tstring &new_str,
bool all = false );
virtual asarray_tstring &strreplace( const tstring &org_str,
const tstring &new_str,
bool all = false );
/* elimination of newline characters in all the elements */
/* perform tstring::chop() for all elements */
virtual asarray_tstring &chop();
/* perform tstring::chomp() for all elements */
virtual asarray_tstring &chomp( const char *rs = "\n" );
virtual asarray_tstring &chomp( const tstring &rs );
/* elimination of spaces at both ends of all the elements */
/* (perform tstring::trim() for all elements) */
virtual asarray_tstring &trim( const char *side_spaces = " \t\n\r\f\v" );
virtual asarray_tstring &trim( const tstring &side_spaces );
virtual asarray_tstring &trim( int side_space );
/* elimination of a space at the left end of all the elements */
/* (perform tstring::ltrim() for all elements) */
virtual asarray_tstring <rim( const char *side_spaces = " \t\n\r\f\v" );
virtual asarray_tstring <rim( const tstring &side_spaces );
virtual asarray_tstring <rim( int side_space );
/* elimination of a space at the right end of all the elements */
/* (perform tstring::rtrim() for all elements) */
virtual asarray_tstring &rtrim( const char *side_spaces = " \t\n\r\f\v" );
virtual asarray_tstring &rtrim( const tstring &side_spaces );
virtual asarray_tstring &rtrim( int side_space );
/* same as trim() */
virtual asarray_tstring &strtrim(const char *side_spaces = " \t\n\r\f\v");
virtual asarray_tstring &strtrim( const tstring &side_spaces );
virtual asarray_tstring &strtrim( int side_space );
/* convert all elements to lowercase */
virtual asarray_tstring &tolower();
/* convert all elements to uppercase */
virtual asarray_tstring &toupper();
/* replacement of tab or space characters for all elements */
/* perform tstring::expand_tabs() for all elements */
virtual asarray_tstring &expand_tabs( size_t tab_width = 8 );
/* perform tstring::contract_spaces() for all elements */
virtual asarray_tstring &contract_spaces( size_t tab_width = 8 );
/* string search and replacement of all the elements using a regular */
/* expression (perform tstring::regreplace() for all elements) */
virtual asarray_tstring ®replace( const char *pat,
const char *new_str, bool all = false );
virtual asarray_tstring ®replace( const tstring &pat,
const char *new_str, bool all = false );
virtual asarray_tstring ®replace( const tregex &pat,
const char *new_str, bool all = false );
virtual asarray_tstring ®replace( const char *pat,
const tstring &new_str, bool all = false );
virtual asarray_tstring ®replace( const tstring &pat,
const tstring &new_str, bool all = false );
virtual asarray_tstring ®replace( const tregex &pat,
const tstring &new_str, bool all = false );
/* returns NULL-terminated pointer array of string elements */
virtual const char *const *cstrarray() const;
/* these functions return value of tstring::cstr() */
virtual const char *c_str( const char *key ) const;
virtual const char *cstr( const char *key ) const;
virtual const char *cstrf( const char *fmt, ... ) const;
virtual const char *vcstrf( const char *fmt, va_list ap ) const;
/* these functions return reference to the element value object */
/* (tstring class) corresponding to a specified key string. */
virtual tstring &at( const char *key );
virtual tstring &atf( const char *fmt, ... );
virtual tstring &vatf( const char *fmt, va_list ap );
#ifdef SLI__OVERLOAD_CONST_AT
virtual const tstring &at( const char *key ) const;
virtual const tstring &atf( const char *fmt, ... ) const;
virtual const tstring &vatf( const char *fmt, va_list ap ) const;
#endif
virtual const tstring &at_cs( const char *key ) const;
virtual const tstring &atf_cs( const char *fmt, ... ) const;
virtual const tstring &vatf_cs( const char *fmt, va_list ap ) const;
virtual tstring &element( const char *key );
/* copy internal string into user's buffer */
virtual ssize_t getstr( const char *key,
char *dest_buf, size_t buf_size ) const;
/* returns length of array being stored in object */
virtual size_t length() const;
/* not recommended */
virtual size_t size() const;
/* length of a string element */
virtual size_t length( const char *key ) const;
/* not recommended */
virtual size_t size( const char *key ) const;
/* this returns character at position = pos of a string element */
virtual int cchr( const char *key, size_t pos ) const;
/* acquire the element number corresponding to a key string */
virtual ssize_t index( const char *key ) const;
virtual ssize_t indexf( const char *fmt, ... ) const;
virtual ssize_t vindexf( const char *fmt, va_list ap ) const;
/* acquire the key string corresponding to an element number */
virtual const char *key( size_t index ) const;
/* acquire the value string corresponding to an element number */
virtual const char *cstr( size_t index ) const;
/* these functions return reference to the element value object */
/* (tstring class) corresponding to a specified element number. */
virtual tstring &at( size_t index );
#ifdef SLI__OVERLOAD_CONST_AT
virtual const tstring &at( size_t index ) const;
#endif
virtual tstring &element( size_t index );
virtual const tstring &at_cs( size_t index ) const;
/* レコードの参照をそのまま返す.ただし読み取り専用 */
/* returns reference of the array object for key strings (read only) */
virtual const tarray_tstring &keys() const;
/* returns reference of the array object for value strings (read only) */
virtual const tarray_tstring &values() const;
/* shallow copy を許可する場合に使う (未実装) */
virtual void set_scopy_flag();
/* display internal information of object. */
/* (for user's debug) */
/* ユーザの debug 用 */
virtual void dprint( const char *msg = NULL ) const;
private:
tarray_tstring key_rec;
tarray_tstring value_rec;
ctindex index_rec;
/* 正規表現用 */
tregex regex_rec;
};
/**
* @example examples_sllib/associative_string_array.cc
* 文字列の連想配列の扱い方を示したコード
*/
}
#endif /* _SLI__ASARRAY_TSTRING_H */