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