CYCLUS
dynamic_module.h
Go to the documentation of this file.
1 #ifndef CYCLUS_SRC_DYNAMIC_MODULE_H_
2 #define CYCLUS_SRC_DYNAMIC_MODULE_H_
3 
4 #include <string>
5 #include <map>
6 
7 #include "error.h"
8 
9 // for testing
10 class SimInitTest;
11 
12 namespace cyclus {
13 
14 class Agent;
15 class Context;
16 
17 typedef Agent* AgentCtor(Context*);
18 
19 class InfileTree;
20 
21 class AgentSpec {
22  public:
23  AgentSpec() {}
27  AgentSpec(std::string str_spec);
28 
31  std::string str();
32 
33  std::string path() { return path_; }
34  std::string lib() { return lib_; }
35  std::string agent() { return agent_; }
36  std::string alias() { return alias_; }
37 
38  private:
39  std::string path_;
40  std::string lib_;
41  std::string agent_;
42  std::string alias_;
43 };
44 
46 
48 
50  public:
51  /// Convenience class for using a stack variable to auto-destruct all loaded
52  /// dynamic modules.
53  class Closer {
54  public:
55  ~Closer() {
56  CloseAll();
57  }
58  };
59 
60  /// Do-nothing constructor
62 
63  /// Returns a newly constructed agent for the given module spec.
64  static Agent* Make(Context* ctx, AgentSpec spec);
65 
66  /// Tests that an agent spec really exists.
67  static bool Exists(AgentSpec spec);
68 
69  /// Closes all statically loaded dynamic modules. This should always be called
70  /// before process termination. This must be called AFTER all agents have
71  /// been destructed.
72  static void CloseAll();
73 
74  /// Tests that an agent spec is for a Python Agent. This will also return false
75  /// if the agent doesn't already exist.
76  static bool IsPyAgent(AgentSpec spec);
77 
78  /// The path to the module's shared object library.
79  std::string path();
80 
81  private:
82  /// Creates a new dynamically loadable module.
83  /// @param name the name of the module
85 
86  /// construct an instance of this module
87  /// @return a fresh instance
88  Agent* ConstructInstance(Context* ctx);
89 
90  /// closes the loaded module dynamic lib
91  void CloseLibrary();
92 
93  /// all dynamically loaded modules are
94  /// added to this map when loaded.
95  static std::map<std::string, DynamicModule*> modules_;
96 
97  /// for testing - see sim_init_tests
98  friend class ::SimInitTest;
99  /// for testing - see sim_init_tests
100  static std::map<std::string, AgentCtor*> man_ctors_;
101 
102  /// the name of the module
103  std::string path_;
104 
105  /// the name of the module
106  std::string ctor_name_;
107 
108  /// the library to open and close
109  void* module_library_;
110 
111  /// a functor for the constructor
112  AgentCtor* ctor_;
113 
114  /// uses dlopen to open the module shared lib
115  void OpenLibrary();
116 
117  /// sets the constructor member
118  void SetConstructor();
119 };
120 
121 } // namespace cyclus
122 
123 #endif // CYCLUS_SRC_DYNAMIC_MODULE_H_
std::string Sanitize()
A class for extracting information from a given XML parser.
Definition: infile_tree.h:22
std::string path()
std::string alias()
std::string lib()
DynamicModule()
Do-nothing constructor.
std::string SanitizeSpec(std::string module_spec)
std::string ModuleConstructor(std::string module_spec)
Convenience class for using a stack variable to auto-destruct all loaded dynamic modules.
A simulation context provides access to necessary simulation-global functions and state...
Definition: context.h:130
The abstract base class used by all types of agents that live and interact in a simulation.
Definition: agent.h:51
taken directly from OsiSolverInterface.cpp on 2/17/14 from https://projects.coin-or.org/Osi/browser/trunk.
Definition: agent.cc:14
std::string agent()
Agent * AgentCtor(Context *)
std::string str()
std::string LibPath()