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はカウントアップされると。