IMP  2.1.0
The Integrative Modeling Platform
domino_macros.h
Go to the documentation of this file.
1 /**
2  * \file IMP/domino/domino_macros.h \brief Various important macros
3  * for implementing decorators.
4  *
5  * Copyright 2007-2013 IMP Inventors. All rights reserved.
6  *
7  */
8 
9 #ifndef IMPDOMINO_MACROS_H
10 #define IMPDOMINO_MACROS_H
11 
12 #include <IMP/domino/domino_config.h>
13 
14 /** \deprecated_at{2.1} Expand the macro inline
15 */
16 #define IMP_PARTICLE_STATES(Name) \
17  public: \
18  IMPDOMINO_DEPRECATED_MACRO(2.1, \
19  "Expand the macro inline.") virtual unsigned int \
20  get_number_of_particle_states() const IMP_OVERRIDE; \
21  virtual void load_particle_state(unsigned int, kernel::Particle *) const \
22  IMP_OVERRIDE; \
23  IMP_OBJECT_NO_WARNING(Name)
24 
25 /** \deprecated_at{2.1} Expand the macro inline
26 */
27 #define IMP_ASSIGNMENTS_TABLE(Name) \
28  public: \
29  IMPDOMINO_DEPRECATED_MACRO(2.1, "Expand the macro inline.") virtual void \
30  load_assignments(const IMP::domino::Subset &s, \
31  AssignmentContainer *ac) const IMP_OVERRIDE; \
32  IMP_OBJECT_NO_WARNING(Name)
33 
34 /** \deprecated_at{2.1} Expand the macro inline
35 */
36 #define IMP_SUBSET_FILTER_TABLE(Name) \
37  public: \
38  IMPDOMINO_DEPRECATED_MACRO( \
39  2.1, "Expand the macro inline.") virtual IMP::domino::SubsetFilter * \
40  get_subset_filter(const IMP::domino::Subset &s, \
41  const IMP::domino::Subsets &excluded) const \
42  IMP_OVERRIDE; \
43  virtual double get_strength(const IMP::domino::Subset &s, \
44  const IMP::domino::Subsets &excluded) const \
45  IMP_OVERRIDE; \
46  IMP_OBJECT_NO_WARNING(Name)
47 
48 /** This macro defines a class NameSubsetFilterTable from a method
49  which is applied to disjoint sets. The code should assume there is
50  a Assignment state and an Ints members which ordered indices into
51  the Assignment for the current set.
52 */
53 #define IMP_DISJOINT_SUBSET_FILTER_TABLE_DECL(Name) \
54  class IMPDOMINOEXPORT Name##SubsetFilterTable \
55  : public DisjointSetsSubsetFilterTable { \
56  typedef DisjointSetsSubsetFilterTable P; \
57  \
58  public: \
59  Name##SubsetFilterTable(IMP::domino::ParticleStatesTable *pst) \
60  : P(pst, std::string(#Name) + std::string(" %1%")) {} \
61  Name##SubsetFilterTable() : P(std::string(#Name) + std::string(" %1%")) {} \
62  virtual IMP::domino::SubsetFilter *get_subset_filter( \
63  const IMP::domino::Subset &s, \
64  const IMP::domino::Subsets &excluded) const IMP_OVERRIDE; \
65  virtual double get_strength(const IMP::domino::Subset &s, \
66  const IMP::domino::Subsets &excluded) const \
67  IMP_OVERRIDE; \
68  IMP_OBJECT_METHODS(Name##SubsetFilterTable); \
69  }; \
70  IMP_OBJECTS(Name##SubsetFilterTable, Name##SubsetFilterTables)
71 
72 #define IMP_DISJOINT_SUBSET_FILTER_TABLE_DEF(Name, filter, strength, next) \
73  struct Name##Filter { \
74  bool operator()(const Assignment &state, const Ints &members) const { \
75  filter; \
76  } \
77  }; \
78  struct Name##Strength { \
79  double operator()(const Subset &s, const Subsets &excluded, \
80  const Ints &members) const { \
81  strength; \
82  } \
83  }; \
84  struct Name##Next { \
85  int operator()(int pos, const Assignment &state, const Ints &set) const { \
86  next; \
87  } \
88  }; \
89  IMP::domino::SubsetFilter *Name##SubsetFilterTable::get_subset_filter( \
90  const IMP::domino::Subset &s, \
91  const IMP::domino::Subsets &excluded) const { \
92  IMP_OBJECT_LOG; \
93  set_was_used(true); \
94  base::Vector<Ints> all; \
95  Ints used; \
96  get_indexes(s, excluded, all, 1, used); \
97  return get_disjoint_set_filter<Name##Filter, Name##Next>( \
98  #Name, s, get_log_level(), all, used); \
99  } \
100  double Name##SubsetFilterTable::get_strength( \
101  const IMP::domino::Subset &s, \
102  const IMP::domino::Subsets &excluded) const { \
103  IMP_OBJECT_LOG; \
104  set_was_used(true); \
105  base::Vector<Ints> all; \
106  Ints used; \
107  get_indexes(s, excluded, all, 0, used); \
108  return get_disjoint_set_strength<Name##Strength>(s, excluded, all, used); \
109  }
110 
111 /** \deprecated_at{2.1} Expand the macro inline
112 */
113 #define IMP_SUBSET_FILTER(Name) \
114  IMPDOMINO_DEPRECATED_MACRO(2.1, "Expand the macro inline.") public \
115  : virtual bool get_is_ok( \
116  const IMP::domino::Assignment &assignment) const IMP_OVERRIDE; \
117  IMP_OBJECT_NO_WARNING(Name)
118 
119 /** \deprecated_at{2.1} Expand the macro inline
120 */
121 #define IMP_DISCRETE_SAMPLER(Name) \
122  IMPDOMINO_DEPRECATED_MACRO(2.1, "Expand the macro inline.") public \
123  : Assignments do_get_sample_assignments( \
124  const IMP::domino::Subset &known) const IMP_OVERRIDE; \
125  IMP_OBJECT_NO_WARNING(Name)
126 
127 /** \deprecated_at{2.1} Expand the macro inline
128  */
129 #define IMP_SUBSET_GRAPH_TABLE(Name) \
130  IMPDOMINO_DEPRECATED_MACRO(2.1, "Expand the macro inline.") public \
131  : IMP_IMPLEMENT(SubsetGraph get_subset_graph( \
132  IMP::domino::ParticleStatesTable *pst) const); \
133  IMP_OBJECT_NO_WARNING(Name)
134 
135 /** This macro defines:
136  - AssignmentsContainer::get_assignments(IntRange)
137  - AssignmentsContainer::add_assignments()
138  - AssignmentsContainer::get_assignments(unsigned int)
139 */
140 #define IMP_ASSIGNMENT_CONTAINER_METHODS(Name) \
141  public: \
142  virtual Assignments get_assignments(IntRange r) const IMP_OVERRIDE { \
143  Assignments ret(r.second - r.first); \
144  for (unsigned int i = 0; i != ret.size(); ++i) { \
145  ret[i] = Name::get_assignment(r.first + i); \
146  } \
147  return ret; \
148  } \
149  virtual Assignments get_assignments() const IMP_OVERRIDE { \
150  return get_assignments(IntRange(0, get_number_of_assignments())); \
151  } \
152  ; \
153  virtual void add_assignments(const Assignments &as) IMP_OVERRIDE { \
154  for (unsigned int i = 0; i < as.size(); ++i) { \
155  Name::add_assignment(as[i]); \
156  } \
157  } \
158  virtual Ints get_particle_assignments(unsigned int index) const \
159  IMP_OVERRIDE { \
160  Ints ret(Name::get_number_of_assignments()); \
161  for (unsigned int i = 0; i < Name::get_number_of_assignments(); ++i) { \
162  ret[i] = get_assignment(i)[index]; \
163  } \
164  return ret; \
165  }
166 
167 /** \deprecated_at{2.1} Use IMP_ASSIGNMENT_CONTAINER_METHODS instead
168 */
169 #define IMP_ASSIGNMENT_CONTAINER(Name) \
170  virtual unsigned int get_number_of_assignments() const IMP_OVERRIDE; \
171  virtual Assignment get_assignment(unsigned int i) const IMP_OVERRIDE; \
172  virtual void add_assignment(const Assignment &a) IMP_OVERRIDE; \
173  IMPDOMINO_DEPRECATED_MACRO(2.1, \
174  "Use IMP_ASSIGNMENT_CONTAINER_METHODS instead"); \
175  IMP_ASSIGNMENT_CONTAINER_METHODS(Name); \
176  IMP_OBJECT_NO_WARNING(Name)
177 
178 /** \deprecated_at{2.1} Use IMP_ASSIGNMENT_CONTAINER_METHODS instead
179 */
180 #define IMP_ASSIGNMENT_CONTAINER_INLINE(Name, show, dest) \
181  virtual unsigned int get_number_of_assignments() const IMP_OVERRIDE; \
182  virtual Assignment get_assignment(unsigned int i) const IMP_OVERRIDE; \
183  virtual void add_assignment(const Assignment &a) IMP_OVERRIDE; \
184  IMPDOMINO_DEPRECATED_MACRO("Use IMP_ASSIGNMENT_CONTAINER_METHODS instead"); \
185  IMP_ASSIGNMENT_CONTAINER_METHODS(Name); \
186  IMP_OBJECT_METHODS(Name)
187 
188 #endif /* IMPDOMINO_MACROS_H */