Commit 1bcb26ba by Maarten L. Hekkelman

extend validator

faster unique_id
parent 32f4749d
...@@ -32,5 +32,6 @@ namespace cif ...@@ -32,5 +32,6 @@ namespace cif
{ {
validator parse_dictionary(std::string_view name, std::istream &is); validator parse_dictionary(std::string_view name, std::istream &is);
void extend_dictionary(validator &v, std::istream &is);
} // namespace cif } // namespace cif
...@@ -1227,23 +1227,37 @@ std::string category::get_unique_id(std::function<std::string(int)> generator) ...@@ -1227,23 +1227,37 @@ std::string category::get_unique_id(std::function<std::string(int)> generator)
{ {
using namespace cif::literals; using namespace cif::literals;
std::string id_tag = "id";
if (m_cat_validator != nullptr and m_cat_validator->m_keys.size() == 1)
id_tag = m_cat_validator->m_keys.front();
// calling size() often is a waste of resources // calling size() often is a waste of resources
if (m_last_unique_num == 0) if (m_last_unique_num == 0)
m_last_unique_num = static_cast<uint32_t>(size()); m_last_unique_num = static_cast<uint32_t>(size());
for (;;) std::string result = generator(static_cast<int>(m_last_unique_num++));
{
std::string result = generator(static_cast<int>(m_last_unique_num++));
if (exists(key(id_tag) == result))
continue;
return result; std::string id_tag = "id";
if (m_cat_validator != nullptr and m_cat_validator->m_keys.size() == 1)
{
if (m_index == nullptr and m_cat_validator != nullptr)
m_index = new category_index(this);
for (;;)
{
if (m_index->find_by_value({{ id_tag, result }}) == nullptr)
break;
result = generator(static_cast<int>(m_last_unique_num++));
}
}
else
{
for (;;)
{
if (not exists(key(id_tag) == result))
break;
result = generator(static_cast<int>(m_last_unique_num++));
}
} }
return result;
} }
void category::update_value(const std::vector<row_handle> &rows, std::string_view tag, std::string_view value) void category::update_value(const std::vector<row_handle> &rows, std::string_view tag, std::string_view value)
......
...@@ -481,4 +481,11 @@ validator parse_dictionary(std::string_view name, std::istream &is) ...@@ -481,4 +481,11 @@ validator parse_dictionary(std::string_view name, std::istream &is)
return result; return result;
} }
} // namespace cif void extend_dictionary(validator &v, std::istream &is)
\ No newline at end of file {
file f;
dictionary_parser p(v, is, f);
p.load_dictionary();
}
} // namespace cif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment