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_SHARED_DATA_EQUALITY_H
10 #define RMF_INTERNAL_SHARED_DATA_EQUALITY_H
11
12 #include "RMF/config.h"
13 #include "RMF/log.h"
14 #include "shared_data_maps.h"
15 #include "RMF/internal/large_set_map.h"
16 #include "RMF/internal/shared_data_ranges.h"
17
18 #include <boost/range/distance.hpp>
19
20 RMF_ENABLE_WARNINGS
21
22 namespace RMF {
23 namespace internal {
24
25 template <class Traits, class SDA, class SDB, class H>
get_equal_values_type(SDA * sda,Category cata,SDB * sdb,Category catb,H)26 bool get_equal_values_type(SDA* sda, Category cata, SDB* sdb, Category catb,
27 H) {
28 RMF_LARGE_UNORDERED_MAP<ID<Traits>, ID<Traits> > keys =
29 get_key_map<Traits, Traits>(sda, cata, sdb, catb);
30 bool ret = true;
31 RMF_FOREACH(NodeID n, get_nodes(sda)) {
32 typedef std::pair<ID<Traits>, ID<Traits> > KP;
33 RMF_FOREACH(KP ks, keys) {
34 typename Traits::ReturnType rta = H::get(sda, n, ks.first);
35 typename Traits::ReturnType rtb = H::get(sdb, n, ks.second);
36 bool ha = !Traits::get_is_null_value(rta);
37 bool hb = !Traits::get_is_null_value(rtb);
38 if (ha != hb) {
39 std::cout << "Nodes " << sda->get_name(n) << " and " << sdb->get_name(n)
40 << " differ in having " << sda->get_name(ks.first)
41 << " bits are " << ha << " and " << hb << std::endl;
42 ret = false;
43 }
44 if (ha && hb && !Traits::get_are_equal(rta, rtb)) {
45 std::cout << "Nodes " << sda->get_name(n) << " and " << sdb->get_name(n)
46 << " differ in values " << sda->get_name(ks.first)
47 << " values are " << rta << " and " << rtb << std::endl;
48 ret = false;
49 }
50 }
51 }
52 return ret;
53 }
54
55 #define RMF_LOADED_EQUAL(Traits, UCName) \
56 ret &= get_equal_values_type<Traits>(sda, cata, sdb, catb, LoadedValues());
57
58 template <class SDA, class SDB>
get_equal_current_values_category(SDA * sda,Category cata,SDB * sdb,Category catb)59 bool get_equal_current_values_category(SDA* sda, Category cata, SDB* sdb,
60 Category catb) {
61 bool ret = true;
62 RMF_FOREACH_TYPE(RMF_LOADED_EQUAL);
63 return ret;
64 }
65
66 template <class SDA, class SDB>
get_equal_current_values(SDA * sda,SDB * sdb)67 bool get_equal_current_values(SDA* sda, SDB* sdb) {
68 RMF_FOREACH(Category cata, sda->get_categories()) {
69 Category catb = sdb->get_category(sda->get_name(cata));
70 if (!get_equal_current_values_category(sda, cata, sdb, catb)) return false;
71 }
72 return true;
73 }
74
75 #define RMF_STATIC_EQUAL(Traits, UCName) \
76 ret &= get_equal_values_type<Traits>(sda, cata, sdb, catb, StaticValues());
77
78 template <class SDA, class SDB>
get_equal_static_values_category(SDA * sda,Category cata,SDB * sdb,Category catb)79 bool get_equal_static_values_category(SDA* sda, Category cata, SDB* sdb,
80 Category catb) {
81 bool ret = true;
82 RMF_FOREACH_TYPE(RMF_STATIC_EQUAL);
83 return ret;
84 }
85
86 template <class SDA, class SDB>
get_equal_static_values(SDA * sda,SDB * sdb)87 bool get_equal_static_values(SDA* sda, SDB* sdb) {
88 RMF_FOREACH(Category cata, sda->get_categories()) {
89 Category catb = sdb->get_category(sda->get_name(cata));
90 if (!get_equal_static_values_category(sda, cata, sdb, catb)) return false;
91 }
92 return true;
93 }
94
95 } // namespace internal
96 } /* namespace RMF */
97
98 RMF_DISABLE_WARNINGS
99
100 #endif /* RMF_INTERNAL_SHARED_DATA_EQUALITY_H */
101