A trie library.
Usage
Search
C++
#include <algorithm>
#include <cassert>
#include <functional>
#include <iterator>
#include <memory>
#include <string>
#include <string_view>
#include <vector>
#include <boost/stl_interfaces/iterator_interface.hpp>
namespace usage_tetengo::trie
{
void search()
{
std::vector<std::string> building_observer_reports{};
[&building_observer_reports](const std::string_view& key) {
building_observer_reports.push_back(std::string{ key });
},
[&building_observer_reports]() { building_observer_reports.push_back("DONE"); }
};
{ "tasakibashi", -5 },
{ "nihongiguchi", -3 },
{ "kumamotoekimae", 0 },
{ "gionbashi", 5 },
{ "gofukumachi", 10 },
{ "kawaramachi", 14 },
{ "keitokukoumae", 18 },
{ "karashimachou", 22 },
},
building_observer_set };
assert(
(building_observer_reports == std::vector<std::string>{
"gionbashi",
"gofukumachi",
"karashimachou",
"kawaramachi",
"keitokukoumae",
"kumamotoekimae",
"nihongiguchi",
"tasakibashi",
"DONE",
}));
[[maybe_unused]]
const int*
const p_found_for_gionbashi = trie_.
find(
"gionbashi");
assert(p_found_for_gionbashi);
assert(*p_found_for_gionbashi == 5);
[[maybe_unused]] const int* const p_found_for_hanabatachou = trie_.find("hanabatachou");
assert(!p_found_for_hanabatachou);
const auto p_subtrie = trie_.subtrie("ka");
std::vector<int> subtrie_values{};
std::copy(std::begin(*p_subtrie), std::end(*p_subtrie), std::back_inserter(subtrie_values));
assert(
(subtrie_values == std::vector<int>{
22,
14,
}));
}
}
C
#include <assert.h>
#include <string.h>
static void adding_observer(const char* const serialized_key, void* const p_context)
{
strcat((char*)p_context, serialized_key);
strcat((char*)p_context, "\n");
}
static void done_observer(void* const p_context)
{
strcat((char*)p_context, "DONE");
}
void usage_tetengo_trie_search()
{
const int initial_values[] = {
-5, -3, 0, 5, 10, 14, 18, 22,
};
{ "tasakibashi", NULL },
{ "nihongiguchi", NULL },
{ "kumamotoekimae", NULL },
{ "gionbashi", NULL },
{ "gofukumachi", NULL },
{ "kawaramachi", NULL },
{ "keitokukoumae", NULL },
{ "karashimachou", NULL },
};
{
initial_elements[i].
p_value = &initial_values[i];
}
char building_observer_reports[128] = { '\0' };
initial_elements,
sizeof(int),
adding_observer,
building_observer_reports,
done_observer,
building_observer_reports,
assert(
strcmp(
building_observer_reports,
"gionbashi\n"
"gofukumachi\n"
"karashimachou\n"
"kawaramachi\n"
"keitokukoumae\n"
"kumamotoekimae\n"
"nihongiguchi\n"
"tasakibashi\n"
"DONE") == 0);
{
(void)p_found_for_gionbashi;
assert(p_found_for_gionbashi);
assert(*p_found_for_gionbashi == 5);
}
{
(void)p_found_for_hanabatachou;
assert(!p_found_for_hanabatachou);
}
size_t subtrie_value_count = 0;
{
subtrie_values[subtrie_value_count] = *p_value;
++subtrie_value_count;
}
assert(subtrie_value_count == 2U);
assert(subtrie_values[0] == 22);
assert(subtrie_values[1] == 14);
}