8 #ifndef IMPKERNEL_KEY_H
9 #define IMPKERNEL_KEY_H
12 #include "internal/key_helpers.h"
19 #include <cereal/access.hpp>
22 IMPKERNEL_BEGIN_NAMESPACE
44 template <
unsigned int ID>
50 static internal::KeyData& get_key_data() {
51 #ifndef IMPKERNEL_INTERNAL_OLD_COMPILER
52 static internal::KeyData static_key_data_(ID);
53 return static_key_data_;
55 return IMP::internal::get_key_data(ID);
62 friend class cereal::access;
64 template<
class Archive>
void serialize(Archive &ar) {
66 if (std::is_base_of<cereal::detail::OutputArchiveBase, Archive>::value) {
67 std::string name = get_string();
72 str_ = find_or_add_index(name);
76 static const internal::KeyData::Map& get_map() {
77 return get_key_data().get_map();
79 static const internal::KeyData::RMap& get_rmap() {
80 IMP::internal::KeyData
const& kd=get_key_data();
81 IMP::internal::KeyData::RMap
const& ret=kd.get_rmap();
86 static unsigned int find_or_add_index(std::string
const& sc) {
90 if (get_map().find(sc) == get_map().end()) {
91 val = get_key_data().add_key(sc);
93 val = get_map().find(sc)->second;
100 static unsigned int find_index(std::string
const& sc) {
104 IMP_USAGE_CHECK( get_key_exists(sc),
"Key<" << ID <<
">::find_index():"
105 <<
" You must explicitly create the type first: "
107 val = get_map().find(sc)->second;
113 bool is_default()
const;
116 #if !defined(IMP_DOXYGEN) && !defined(SWIG)
117 static unsigned int get_ID() {
return ID; }
119 static const std::string get_string(
int i) {
122 if (static_cast<unsigned int>(i) < get_rmap().size()) {
128 << i <<
" with a table of size " << get_rmap().size());
150 explicit Key(std::string
const& c,
bool is_implicit_add_permitted=
true)
151 : str_(is_implicit_add_permitted ? find_or_add_index(c) : find_index(c))
154 #if !defined(IMP_DOXYGEN)
157 explicit Key(
unsigned int i) : str_(i) {
163 static unsigned int add_key(std::string sc) {
168 val = get_key_data().add_key(sc);
173 static
bool get_key_exists(std::
string sc) {
176 val = get_map().find(sc) != get_map().end();
182 if (is_default())
return std::string(
"nullptr");
184 val = get_string(str_);
201 std::string new_name) {
203 "The name is already taken with an existing key or alias");
204 get_key_data().add_alias(new_name, old_key.get_index());
205 return Key<ID>(new_name.c_str());
208 static unsigned int get_number_of_keys() {
209 return get_rmap().size();
215 "Cannot get index on defaultly constructed Key");
221 static void show_all(std::ostream& out);
227 static Vector<std::string> get_all_strings();
247 Key operator+(
int o)
const {
258 template <
unsigned int ID>
259 inline std::ostream& operator<<(std::ostream& out, Key<ID> k) {
264 template <
unsigned int ID>
265 inline bool Key<ID>::is_default()
const {
269 template <
unsigned int ID>
270 inline void Key<ID>::show_all(std::ostream& out) {
272 get_key_data().
show(out);
275 template <
unsigned int ID>
276 Vector<std::
string> Key<ID>::get_all_strings() {
277 Vector<std::string> str;
279 for (internal::KeyData::Map::const_iterator it = get_map().begin();
280 it != get_map().end(); ++it) {
281 str.push_back(it->first);
287 IMPKERNEL_END_NAMESPACE
#define IMP_SHOWABLE_INLINE(Name, how_to_show)
Declare the methods needed by an object that can be printed.
Helper macros for implementing comparisons of IMP objects.
#define IMP_FAILURE(message)
A runtime failure for IMP.
#define IMP_HASHABLE_INLINE(name, hashret)
Key()
make a default key in a well-defined null state
#define IMP_LOG_PROGRESS(expr)
const std::string get_string() const
Turn a key into a pretty string.
#define IMP_INTERNAL_CHECK(expr, message)
An assertion to check for internal errors in IMP. An IMP::ErrorException will be thrown.
Base class for a simple primitive-like type.
static unsigned int get_number_unique()
Get the total number of keys of this type.
Ints get_index(const ParticlesTemp &particles, const Subset &subset, const Subsets &excluded)
Helper macros for implementing hashable classes.
Logging and error reporting support.
Various general useful functions for IMP.
std::ostream & show(Hierarchy h, std::ostream &out=std::cout)
Print the hierarchy using a given decorator to display each node.
Helper macros for throwing and handling exceptions.
Base class for a simple primitive-like type.
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method.
static Key< ID > add_alias(Key< ID > old_key, std::string new_name)
Make new_name an alias for old_key.
#define IMP_COMPARISONS_1(Name, field)
Implement comparison in a class using field as the variable to compare.
Key(std::string const &c, bool is_implicit_add_permitted=true)
Generate a key object from the given string.
#define IMP_OMP_PRAGMA(x)