#include #include #include #include #include "s_table.h" struct s_table { std::vector records; }; struct s_table * s_table_new() { return new s_table(); } void s_table_delete(struct s_table * t) { return delete(t); } void s_table_clear(struct s_table * t) { t->records.clear(); } int s_table_add_record(struct s_table * t, const char * begin, const char * end) { t->records.push_back(std::string(begin, end)); return 1; } int s_table_remove_record(struct s_table * t, const char * begin, const char * end) { std::string x(begin, end); for (std::vector::iterator i = t->records.begin(); i != t->records.end(); ++i) { if (*i == x) { std::vector::iterator last = t->records.end() - 1; if (i != last) *i = *last; t->records.erase(last, t->records.end()); return 1; } } return 0; } size_t s_table_remove_records(struct s_table * t, feature_extractor selector) { size_t res = 0; std::vector::iterator last = t->records.end(); for (std::vector::iterator i = t->records.begin(); i != t->records.end(); ++i) { if (selector(i->data(), i->data() + i->size())) { last -= 1; if (i != last) *i = *last; res += 1; } } t->records.erase(last, t->records.end()); return res; } size_t s_table_max_feature(struct s_table * t, feature_extractor feature, char * record, size_t record_max_len) { if (t->records.size() == 0) return 0; std::vector::iterator max_i = t->records.begin(); std::vector::iterator i = t->records.begin(); int max_v = feature(i->data(), i->data() + i->size()); for (; i != t->records.end(); ++i) { int v = feature(i->data(), i->data() + i->size()); if (max_v < v) { max_i = i; max_v = v; } } size_t j = 0; for(std::string::const_iterator c = max_i->begin(); j < record_max_len && c != max_i->end(); ++j, ++c) record[j] = *c; return j; } void s_table_print_sorted(struct s_table * t, FILE * f, feature_extractor feature) { std::multimap M; for (std::vector::const_iterator i = t->records.begin(); i != t->records.end(); ++i) M.insert(std::pair(feature(i->data(), i->data() + i->size()), i - t->records.begin())); for (std::multimap::const_iterator i = M.begin(); i != M.end(); ++i) fprintf(f, "%s\n", t->records[i->second].c_str()); }