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