sen_values構造体
Advanced APIを使用する場合、sen_index_updates関数等による更新系処理を行う際に渡すデータとして、生の文字列ではなくsen_values構造体としてが使用される。
typedef struct _sen_values sen_values; struct _sen_values { int n_values; sen_value *values; };
n_valuesはこの構造体に格納されたデータの数。そしてvaluesはsen_value構造体の配列。つまりsen_valuesには複数の値を格納できる。
typedef struct _sen_value sen_value; struct _sen_value { const char *str; unsigned int str_len; unsigned int weight; };
sen_value構造体には文字列データを格納するstr、その文字列長を格納するstr_len、重み付けを指定するweightがメンバとして定義されている。weightはTritonnでは使用していない(=0のみ)けどね。将来的に便利な使い方&実装が見付かった時に使えるといいな。
このsen_valuesはsen_values_open関数でメモリを割り当てて使う。
sen_values * sen_values_open(void) { sen_values *v = SEN_MALLOC(sizeof(sen_values)); if (v) { v->n_values = 0; v->values = NULL; } return v; }
これにデータを追加(格納)するにはsen_values_add関数を使用する。
#define INITIAL_VALUE_SIZE 1024 sen_rc sen_values_add(sen_values *v, const char *str, unsigned int str_len, unsigned int weight) { sen_value *vp; if (!v || !str) { SEN_LOG(sen_log_warning, "sen_values_add: invalid argument"); return sen_invalid_argument; } if (!(v->n_values & (INITIAL_VALUE_SIZE - 1))) { vp = SEN_REALLOC(v->values, sizeof(sen_value) * (v->n_values + INITIAL_VALUE_SIZE)); SEN_LOG(sen_log_debug, "expanded values to %d,%p", v->n_values + INITIAL_VALUE_SIZE, vp); if (!vp) { return sen_memory_exhausted; } v->values = vp; } vp = &v->values[v->n_values]; vp->str = str; vp->str_len = str_len; vp->weight = weight; v->n_values++; return sen_success; }
初回データ追加時(n_values=0)またはデータ数が1024(n_values=1023+1)に達する場合はメモリ(再)割当て。ふむ、いきなり1024個分もrealloc(3)するのか。sen_values_openからsen_values_closeまでの間に1回しかsen_values_addしない場合だと無駄になる? あとでグニャラさんに聞いてみようっと。
追加する度にn_valuesはカウントアップされると。