From eb05c7622edb633f2b152280a78d68dc2f6a5a81 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Mon, 26 May 2014 17:11:07 +1000 Subject: [PATCH] add stringid for mapping between strings and ints --- Makefile.am | 2 ++ stringid.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++ stringid.hpp | 41 +++++++++++++++++++++++++++++++ test/Makefile.am | 3 ++- test/stringid.cpp | 42 ++++++++++++++++++++++++++++++++ 5 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 stringid.cpp create mode 100644 stringid.hpp create mode 100644 test/stringid.cpp diff --git a/Makefile.am b/Makefile.am index 76226e1d..ab78f268 100644 --- a/Makefile.am +++ b/Makefile.am @@ -137,6 +137,8 @@ UTIL_FILES = \ stream.hpp \ string.cpp \ string.hpp \ + stringid.cpp \ + stringid.hpp \ time.cpp \ time.hpp \ types.hpp \ diff --git a/stringid.cpp b/stringid.cpp new file mode 100644 index 00000000..25b12dbf --- /dev/null +++ b/stringid.cpp @@ -0,0 +1,61 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2014 Danny Robson + */ + +#include "stringid.hpp" + +#include "raii.hpp" + +#include +#include + +using util::stringid; + + +//----------------------------------------------------------------------------- +stringid::id_t +stringid::add (const std::string key) { + auto pos = m_map.find (key); + if (pos != m_map.end ()) + throw std::invalid_argument ("duplicate stringid key"); + + static std::mutex s_lock; + std::lock_guard raii (s_lock); + + id_t id = m_map.size (); + m_map[key] = id; + return id; +} + + +//----------------------------------------------------------------------------- +stringid::id_t +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"); + + return pos->second; +} + + +//----------------------------------------------------------------------------- +void +stringid::clear (void) { + m_map.clear (); +} diff --git a/stringid.hpp b/stringid.hpp new file mode 100644 index 00000000..3601ce5b --- /dev/null +++ b/stringid.hpp @@ -0,0 +1,41 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2014 Danny Robson + */ + +#ifndef __UTIL_STRINGID_HPP +#define __UTIL_STRINGID_HPP + +#include +#include + +namespace util { + class stringid { + public: + typedef unsigned id_t; + + id_t add (std::string); + id_t find (const std::string&) const; + + void clear (void); + + private: + std::map m_map; + }; +} + +#endif diff --git a/test/Makefile.am b/test/Makefile.am index 5cb656be..98d3489d 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -21,9 +21,10 @@ TEST_BIN = \ range \ region \ ripemd \ - signal \ sha1 \ sha2 \ + signal \ + stringid \ version AM_DEFAULT_SOURCE_EXT = .cpp diff --git a/test/stringid.cpp b/test/stringid.cpp new file mode 100644 index 00000000..0202e28d --- /dev/null +++ b/test/stringid.cpp @@ -0,0 +1,42 @@ +/* + * This file is part of libgim. + * + * libgim is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * libgim is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with libgim. If not, see . + * + * Copyright 2014 Danny Robson + */ + +#include "../stringid.hpp" +#include "../debug.hpp" + +#include +#include + +int +main (int, char**) { + util::stringid map; + + CHECK_THROWS (std::out_of_range, map.find ("invalid")); + + auto id1 = map.add ("first"); + CHECK_EQ (id1, map.find ("first")); + + CHECK_THROWS (std::out_of_range, map.find ("invalid")); + + auto id2 = map.add ("second"); + CHECK_EQ (id1 + 1, id2); + CHECK_EQ (id1, map.find ("first")); + + return EXIT_SUCCESS; +}