stringid: add query-or-insert indexing operator
This commit is contained in:
parent
cffc3bbc46
commit
c2f203b5a7
28
stringid.cpp
28
stringid.cpp
@ -13,9 +13,23 @@
|
||||
using cruft::stringid;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
stringid::id_t
|
||||
stringid::add (std::string key) {
|
||||
stringid::operator[] (std::string_view const &key)
|
||||
{
|
||||
if (auto const pos = m_map.find (key); pos != m_map.cend ())
|
||||
return pos->second;
|
||||
|
||||
|
||||
auto const &[pos, success] = m_map.emplace (key, m_map.size ());
|
||||
return pos->second;
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
stringid::id_t
|
||||
stringid::add (std::string key)
|
||||
{
|
||||
auto pos = m_map.find (key);
|
||||
if (pos != m_map.end ())
|
||||
throw std::invalid_argument ("duplicate stringid key");
|
||||
@ -26,9 +40,10 @@ stringid::add (std::string key) {
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
stringid::id_t
|
||||
stringid::find (const std::string &key) const {
|
||||
stringid::find (const std::string &key) const
|
||||
{
|
||||
auto pos = m_map.find (key);
|
||||
if (pos == m_map.end ())
|
||||
throw std::out_of_range ("invalid stringid key");
|
||||
@ -37,8 +52,9 @@ stringid::find (const std::string &key) const {
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
void
|
||||
stringid::clear (void) {
|
||||
stringid::clear (void)
|
||||
{
|
||||
m_map.clear ();
|
||||
}
|
||||
|
@ -19,6 +19,11 @@ namespace cruft {
|
||||
public:
|
||||
typedef size_t id_t;
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
/// Returns the ID for the supplied string, or creates and returns a
|
||||
/// new ID if the string is not present.
|
||||
id_t operator[] (std::string_view const&);
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
id_t add (std::string);
|
||||
@ -59,7 +64,7 @@ namespace cruft {
|
||||
|
||||
|
||||
private:
|
||||
std::map<const std::string, id_t> m_map;
|
||||
std::map<const std::string, id_t, std::less<>> m_map;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -23,5 +23,10 @@ main (int, char**) {
|
||||
tap.expect_eq (id1 + 1, id2, "monotonically increasing IDs");
|
||||
tap.expect_eq (id1, map.find ("first"), "first element still matches");
|
||||
|
||||
tap.expect_eq (map["second"], id2, "index lookup invokes no change");
|
||||
|
||||
auto id3 = map["third"];
|
||||
tap.expect (id3 != id1 && id3 != id2, "index creation adds new value");
|
||||
|
||||
return tap.status ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user