IMP logo
IMP Reference Guide  develop.78018a392b,2024/05/10
The Integrative Modeling Platform
SingletonContainer.h
Go to the documentation of this file.
1 // Autogenerated by ../../../../tmp/nightly-build-60898/imp-20240510.develop.78018a392b/tools/build/make_containers.py
2 // from ../../../../tmp/nightly-build-60898/imp-20240510.develop.78018a392b/tools/build/container_templates/kernel/ClassnameContainer.h
3 // Do not edit - any changes will be lost!
4 
5 /**
6  * \file IMP/SingletonContainer.h
7  * \brief A container for Singletons.
8  *
9  * Copyright 2007-2022 IMP Inventors. All rights reserved.
10  */
11 
12 #ifndef IMPKERNEL_SINGLETON_CONTAINER_H
13 #define IMPKERNEL_SINGLETON_CONTAINER_H
14 
15 #include <IMP/kernel_config.h>
16 #include "internal/IndexingIterator.h"
17 #include "Particle.h"
18 #include "container_base.h"
19 #include "internal/container_helpers.h"
20 #include "DerivativeAccumulator.h"
21 #include "base_types.h"
22 #include <IMP/ref_counted_macros.h>
23 #include <IMP/check_macros.h>
24 #include <IMP/Pointer.h>
25 #include <IMP/InputAdaptor.h>
26 #include <IMP/utility_macros.h>
27 #include <IMP/deprecation_macros.h>
28 #include <algorithm>
29 #include <cereal/access.hpp>
30 #include <cereal/types/base_class.hpp>
31 
32 IMPKERNEL_BEGIN_NAMESPACE
33 class SingletonModifier;
34 class SingletonScore;
35 
36 //! A shared container for Singletons
37 /** Stores a shared collection of Singletons.
38  */
39 class IMPKERNELEXPORT SingletonContainer : public Container {
40  public:
41  typedef Particle* ContainedType;
47 
48  //! Just use apply() in the base class
49  void apply_generic(const SingletonModifier *m) const;
50 
51  //! Just use apply_moved() in the base class
52  void apply_generic_moved(const SingletonModifier *m,
53  const ParticleIndexes &moved_pis,
54  const ParticleIndexes &reset_pis) const;
55 
56  //! Apply a SingletonModifier to the contents
57  void apply(const SingletonModifier *sm) const;
58 
59  //! Apply a SingletonModifier to the contents
60  void apply_moved(const SingletonModifier *sm,
61  const ParticleIndexes &moved_pis,
62  const ParticleIndexes &reset_pis) const;
63 
64  /** Get all the indexes that might possibly be contained in the
65  container, useful with dynamic containers. For example,
66  with a container::ClosePairContainer, this is the list
67  of all pairs taken from the input list (those that are far apart
68  in addition to those that are close).
69  */
70  virtual ParticleIndexes get_range_indexes() const = 0;
71 
72  const ParticleIndexes &get_contents() const {
73  if (get_provides_access())
74  return get_access();
75  else {
76  std::size_t nhash = get_contents_hash();
77  if (contents_hash_ != nhash || !cache_initialized_) {
78  contents_hash_ = nhash;
79  cache_initialized_ = true;
80  get_indexes_in_place(contents_cache_); // inheriting class could implement this faster than get_indexes()
81  }
82  return contents_cache_;
83  }
84  }
85 
86  /** Get all the indexes contained in the container.
87 
88  This should be protected but isn't for compatibility reasons.
89 
90  External callers should use get_contents().
91  */
92  virtual ParticleIndexes get_indexes() const = 0;
93 
94 
95 #ifndef IMP_DOXYGEN
96 
97  ParticlesTemp get() const {
98  return IMP::internal::get_particle(get_model(), get_indexes());
99  }
100 
101  Particle* get(unsigned int i) const {
102  return IMP::internal::get_particle(get_model(), get_indexes()[i]);
103  }
104 
105  //! Return size of current container content
106  //! Note that this may be expensive since it may involve
107  //! refreshing of the container
108  unsigned int get_number() const { return get_indexes().size(); }
109 #ifndef SWIG
110  bool get_provides_access() const;
111  virtual const ParticleIndexes &get_access() const {
112  IMP_THROW("Object not implemented properly.", IndexException);
113  }
114 
115  template <class Functor>
116  Functor for_each(Functor f) {
118  // use boost range instead
119  return std::for_each(vs.begin(), vs.end(), f);
120  }
121 
122 #endif
123 #endif
124 
125  protected:
127  std::string name = "SingletonContainer %1%");
128  SingletonContainer() {}
129 
130  virtual void do_apply(const SingletonModifier *sm) const = 0;
131  virtual void do_apply_moved(const SingletonModifier *sm,
132  const ParticleIndexes &moved_pis,
133  const ParticleIndexes &reset_pis) const {
134  IMP_UNUSED(moved_pis);
135  IMP_UNUSED(reset_pis);
136  do_apply(sm);
137  }
138  virtual bool do_get_provides_access() const { return false; }
139 
140 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
141  //! Insert the contents of the container into output
142  //! Could be reimplemented to save time in terms of e.g. memory
143  //! allocation compared with calling get_indexes()
144  virtual void get_indexes_in_place(ParticleIndexes& output) const{
145  output= get_indexes();
146  }
147 #endif
148 
150 
151  private:
152  mutable std::size_t contents_hash_;
153  mutable ParticleIndexes contents_cache_;
154  mutable bool cache_initialized_;
155 
156  friend class cereal::access;
157 
158  template<class Archive> void serialize(Archive &ar) {
159  ar(cereal::base_class<Container>(this));
160  // clear cache on read
161  if (std::is_base_of<cereal::detail::InputArchiveBase, Archive>::value) {
162  contents_hash_ = -1;
163  cache_initialized_ = false;
164  }
165  }
166 
167 };
168 
169 /** This class allows either a list or a container to be
170  accepted as input.
171 */
172 class IMPKERNELEXPORT SingletonContainerAdaptor :
173 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
174  public Pointer<SingletonContainer>
175 #else
176  public InputAdaptor
177 #endif
178  {
180 
181  public:
183 
184  /**
185  Constructs the adaptor pointing to c (so if the contents of c are changed
186  dynamically, so do the contents of the adaptor, and vice versa)
187  */
189 
190  /**
191  Constructs the adaptor pointing to c (so if the contents of c are changed
192  dynamically, so do the contents of the adaptor, and vice versa)
193  */
194  template <class C>
195  SingletonContainerAdaptor(IMP::internal::PointerBase<C> c)
196  : P(c) {}
197 
198  /**
199  Adapts the non-empty list t to SingletonContainer
200 
201  @param t a non-empty list of ParticlesTemp
202  */
204 
205  /** Set the name of the resulting container if it is currently the
206  default value. */
207  void set_name_if_default(std::string name);
208 };
209 
210 IMPKERNEL_END_NAMESPACE
211 
212 #endif /* IMPKERNEL_SINGLETON_CONTAINER_H */
A base class for modifiers of ParticlesTemp.
Control display of deprecation information.
Macros to help with reference counting.
Basic types used by IMP.
Class for adding derivatives from restraints to the model.
std::size_t get_contents_hash() const
A smart pointer to a reference counted object.
Definition: Pointer.h:87
Class for storing model, its restraints, constraints, and particles.
Definition: Model.h:86
Convenience class to accept multiple input types.
#define IMP_UNUSED(variable)
Various general useful macros for IMP.
An exception for a request for an invalid member of a container.
Definition: exception.h:156
A shared container for Singletons.
Classes to handle individual model particles. (Note that implementation of inline functions is in int...
Abstract base class for containers of particles.
#define IMP_THROW(message, exception_name)
Throw an exception with a message.
Definition: check_macros.h:50
A nullptr-initialized pointer to an IMP Object.
Helper macros for throwing and handling exceptions.
Class to handle individual particles of a Model object.
Definition: Particle.h:43
#define IMP_REF_COUNTED_NONTRIVIAL_DESTRUCTOR(Name)
Convenience class to accept multiple input types.
Definition: InputAdaptor.h:25
SingletonContainerAdaptor(IMP::internal::PointerBase< C > c)
ParticleIndexes get_indexes(const ParticlesTemp &ps)
Get the indexes from a list of particles.
Abstract class for containers of particles.