1 /** 2 * \file RMF/internal/SharedData.h 3 * \brief Handle read/write of Model data from/to files. 4 * 5 * Copyright 2007-2021 IMP Inventors. All rights reserved. 6 * 7 */ 8 9 #ifndef RMF_INTERNAL_KEY_FILTER_H 10 #define RMF_INTERNAL_KEY_FILTER_H 11 12 #include "RMF/config.h" 13 #include "RMF/internal/SharedData.h" 14 #include "backward_types.h" 15 #include "SharedDataAdaptor.h" 16 #include "RMF/log.h" 17 18 RMF_ENABLE_WARNINGS 19 20 namespace RMF { 21 22 namespace backends { 23 24 template <class SD> 25 class KeyFilter : public SharedDataAdaptor<SD> { 26 typedef SharedDataAdaptor<SD> P; 27 backward_types::IndexKeys index_keys_; 28 FloatKeys float_keys_; 29 FloatsKeys floats_keys_; 30 31 public: KeyFilter(SD * sd)32 KeyFilter(SD* sd) : P(sd) {} add_index_key(Category cat,std::string name)33 void add_index_key(Category cat, std::string name) { 34 RMF_FOREACH(backward_types::IndexKey k, 35 P::sync_->get_keys(cat, backward_types::IndexTraits())) { 36 if (P::sync_->get_name(k) == name) { 37 index_keys_.push_back(k); 38 std::sort(index_keys_.begin(), index_keys_.end()); 39 break; 40 } 41 } 42 } add_float_key(Category cat,std::string name)43 void add_float_key(Category cat, std::string name) { 44 RMF_FOREACH(FloatKey k, P::sync_->get_keys(cat, FloatTraits())) { 45 if (P::sync_->get_name(k) == name) { 46 float_keys_.push_back(k); 47 std::sort(float_keys_.begin(), float_keys_.end()); 48 break; 49 } 50 } 51 } add_floats_key(Category cat,std::string name)52 void add_floats_key(Category cat, std::string name) { 53 RMF_FOREACH(FloatsKey k, P::sync_->get_keys(cat, FloatsTraits())) { 54 if (P::sync_->get_name(k) == name) { 55 floats_keys_.push_back(k); 56 std::sort(floats_keys_.begin(), floats_keys_.end()); 57 break; 58 } 59 } 60 } 61 template <class Traits> get_keys(Category cat,Traits)62 std::vector<ID<Traits> > get_keys(Category cat, Traits) { 63 return P::sync_->get_keys(cat, Traits()); 64 } get_keys(Category cat,backward_types::IndexTraits)65 backward_types::IndexKeys get_keys(Category cat, 66 backward_types::IndexTraits) { 67 backward_types::IndexKeys all = 68 P::sync_->get_keys(cat, backward_types::IndexTraits()); 69 std::sort(all.begin(), all.end()); 70 backward_types::IndexKeys ret; 71 std::set_difference(all.begin(), all.end(), index_keys_.begin(), 72 index_keys_.end(), std::back_inserter(ret)); 73 return ret; 74 } get_keys(Category cat,FloatTraits)75 FloatKeys get_keys(Category cat, FloatTraits) { 76 FloatKeys all = P::sync_->get_keys(cat, FloatTraits()); 77 std::sort(all.begin(), all.end()); 78 FloatKeys ret; 79 std::set_difference(all.begin(), all.end(), float_keys_.begin(), 80 float_keys_.end(), std::back_inserter(ret)); 81 return ret; 82 } get_keys(Category cat,FloatsTraits)83 FloatsKeys get_keys(Category cat, FloatsTraits) { 84 FloatsKeys all = P::sync_->get_keys(cat, FloatsTraits()); 85 std::sort(all.begin(), all.end()); 86 FloatsKeys ret; 87 std::set_difference(all.begin(), all.end(), floats_keys_.begin(), 88 floats_keys_.end(), std::back_inserter(ret)); 89 return ret; 90 } 91 }; 92 93 } // namespace internal 94 } /* namespace RMF */ 95 96 RMF_DISABLE_WARNINGS 97 98 #endif /* RMF_INTERNAL_KEY_FILTER_H */ 99