00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef moses_CmphStringVectorAdapterNew_h
00023 #define moses_CmphStringVectorAdapterNew_h
00024
00025 #include <cassert>
00026 #include <cstring>
00027
00028 #ifdef HAVE_CMPH
00029 #include "cmph.h"
00030
00031 #include "StringVector.h"
00032
00033 namespace Moses
00034 {
00035
00036 typedef struct {
00037 void *vector;
00038 cmph_uint32 position;
00039 }
00040 cmph_vector_t;
00041
00042
00043 template <typename ValueT, typename PosT, template <typename> class Allocator>
00044 cmph_io_adapter_t *CmphStringVectorAdapterNew(StringVector<ValueT, PosT, Allocator>& sv)
00045 {
00046 cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t));
00047 cmph_vector_t * cmph_vector = (cmph_vector_t *)malloc(sizeof(cmph_vector_t));
00048 assert(key_source);
00049 assert(cmph_vector);
00050
00051 cmph_vector->vector = (void *)&sv;
00052 cmph_vector->position = 0;
00053 key_source->data = (void *)cmph_vector;
00054 key_source->nkeys = sv.size();
00055
00056 return key_source;
00057 }
00058
00059 template <typename ValueT, typename PosT, template <typename> class Allocator>
00060 int CmphStringVectorAdapterRead(void *data, char **key, cmph_uint32 *keylen)
00061 {
00062 cmph_vector_t *cmph_vector = (cmph_vector_t *)data;
00063 StringVector<ValueT, PosT, Allocator>* sv = (StringVector<ValueT, PosT, Allocator>*)cmph_vector->vector;
00064 size_t size;
00065 *keylen = (*sv)[cmph_vector->position].size();
00066 size = *keylen;
00067 *key = new char[size + 1];
00068 std::string temp = (*sv)[cmph_vector->position];
00069 std::strcpy(*key, temp.c_str());
00070 cmph_vector->position = cmph_vector->position + 1;
00071 return (int)(*keylen);
00072 }
00073
00074 void CmphStringVectorAdapterDispose(void *data, char *key, cmph_uint32 keylen);
00075
00076 void CmphStringVectorAdapterRewind(void *data);
00077
00078 template <typename ValueT, typename PosT, template <typename> class Allocator>
00079 cmph_io_adapter_t* CmphStringVectorAdapter(StringVector<ValueT, PosT, Allocator>& sv)
00080 {
00081 cmph_io_adapter_t * key_source = CmphStringVectorAdapterNew(sv);
00082
00083 key_source->read = CmphStringVectorAdapterRead<ValueT, PosT, Allocator>;
00084 key_source->dispose = CmphStringVectorAdapterDispose;
00085 key_source->rewind = CmphStringVectorAdapterRewind;
00086 return key_source;
00087 }
00088
00089
00090
00091 cmph_io_adapter_t *CmphVectorAdapterNew(std::vector<std::string>& v);
00092
00093 int CmphVectorAdapterRead(void *data, char **key, cmph_uint32 *keylen);
00094
00095 void CmphVectorAdapterDispose(void *data, char *key, cmph_uint32 keylen);
00096
00097 void CmphVectorAdapterRewind(void *data);
00098
00099 cmph_io_adapter_t* CmphVectorAdapter(std::vector<std::string>& v);
00100
00101 }
00102
00103 #endif
00104
00105 #endif