source: XIOS/dev/branch_yushan/src/registry.hpp @ 1060

Last change on this file since 1060 was 1053, checked in by yushan, 7 years ago

ep_lib namespace specified when netcdf involved

File size: 4.9 KB
RevLine 
[696]1#ifndef __XIOS_REGISTRY_HPP__
2#define __XIOS_REGISTRY_HPP__
3
4#include "base_type.hpp"
5#include "type.hpp"
6#include "mpi.hpp"
7#include "message.hpp"
[1037]8#ifdef _usingEP
9#include "ep_declaration.hpp"
10#endif
[696]11
[1037]12
[700]13// Those two headers can be replaced by the C++11 equivalent in the future
14#include <boost/utility/enable_if.hpp>
15#include <boost/type_traits.hpp>
16
[696]17namespace xios
18{
19/*!
20  \class CRegistry
[700]21 This class is a registry database which store key with an associated value. Internally the value is stored as a memory bloc
22 and the key is a string. The registry can be gathered and merge between MPI process, broadcast and read or wrote from a file
[696]23*/
24  class CRegistry : virtual public CBaseType
25  {
26    public:
27
28/** Constructor, the communicator is used for bcast or gather operation between MPI processes */
[1037]29     
[1053]30      CRegistry(const ep_lib::MPI_Comm& comm=MPI_COMM_WORLD) : communicator(comm) {}
[1037]31     
32     
33     
[696]34/** Copy constructor */
35      CRegistry(const CRegistry& reg) ;
36
[700]37
[696]38/** insert a value associated to a key*/
[700]39      void setKey(const std::string& key, const CBaseType& value) { this->setKey_(key,value); }
[696]40
41/** insert a value associated to a key*/
[700]42      template<typename T> typename boost::enable_if_c<!boost::is_convertible<T&, CBaseType&>::value>::type
43      setKey(const std::string& key, const T& value) { this->setKey_(key,CType<T>(value)); }
[696]44
45
[700]46/** retrieve a value from a key */
47      void getKey(const std::string& key, CBaseType& value) { this->getKey_(key,value); }
[696]48
[700]49/** retrieve a value from a key */
50      template<typename T> typename boost::enable_if_c<!boost::is_convertible<T&, CBaseType&>::value>::type
51      getKey(const std::string& key, T& value) { CType_ref<T> valRef(value); this->getKey_(key,valRef); }
[696]52
53
54/** query for an already inserted key */
55      bool foundKey(const std::string& key) const ;
[700]56
[696]57/** The registry is wrote into a memory buffer */
58      bool toBuffer(CBufferOut& buffer) const ;
59
60/** The registry is read from a memory buffer */
61      bool fromBuffer(CBufferIn& buffer) ;
62
63/** The registry is wrote to the file given by "filename". If the registry is empty no file is wrote */
64      void toFile(const string& filename) ;
65
[700]66/** The registry is read from the file given by "filename". If no file exist, the registry remain empty */
[696]67      void fromFile(const string& filename) ;
68
[700]69/** Merge the registry with an other. Existing keys in the current registry are not overwritten */
[696]70      void mergeRegistry(const CRegistry& inRegistry) ;
71
[700]72/** Broadcast registry from the root process (rank 0) to the other processes of the communicator */
[696]73      void bcastRegistry(void) ;
74
[700]75/** Gather registry to the root process (rank 0) from the other processes of the communicator */
[696]76      void gatherRegistry(void) ;
77
[700]78/** Gather registry with a hierarchical algorithm which avoid root process to get registries from whole processes of the communicator.
79   Registry are merged two by two hierarchically. */
[696]80      void hierarchicalGatherRegistry(void) ;
81
82/** Destructor */
83       ~CRegistry() { reset() ; }
84
85/** Unimplemented, do not use (need for CBaseType pure virtual class) */
86      void fromString(const string& str) ;
87
[700]88/** Dump registry to a string (need for CBaseType pure virtual class)*/
[696]89      string toString(void) const ;
90
[700]91/** Clone the registry (need for CBaseType pure virtual class)*/
[696]92      CRegistry* clone(void) const { return new CRegistry(*this); }
93
[700]94/** return the size needed to bufferize the registry (need for CBaseType pure virtual class)*/
[696]95      size_t size(void) const ;
96
[700]97/** return true if the registry is empty (need for CBaseType pure virtual class)*/
[696]98      bool isEmpty(void) const { return registry.empty(); }
99
[700]100/** Clean the registry and delete associated memory (need for CBaseType pure virtual class)*/
[696]101      void reset(void) ;
102
[700]103/** Set the prefix added systematically to the keys, with "::" as separator*/
[696]104      void setPath(const string& str) { path=str+"::" ; }
[700]105
[696]106    private:
107
108/** insert a value associated to a key (internal use)*/
109      void setKey_(const std::string& key, const CBaseType& value) ;
110
[700]111/** retrieve a value from a key (internal use)*/
112      void getKey_(const std::string& key, CBaseType& value) ;
113
[696]114/** use internally for recursivity */
115      void gatherRegistry(const MPI_Comm& comm) ;
116
117/** use internally for recursivity */
118      void hierarchicalGatherRegistry(const MPI_Comm& comm) ;
119
120
[700]121/** Prefix added systematically to the keys, with "::" as separator*/
[696]122      std::string path ;
123
124/** Map containing registry, the key is a string type and the value is stored in a pair with the size
[700]125 *  of the memory bloc and the associated pointer*/
[696]126      std::map<std::string,std::pair<size_t,char*> > registry ;
127
128/** MPI communicator used for broadcast and gather operation */
[1053]129      ep_lib::MPI_Comm communicator ;
[696]130  } ;
131
132  inline CMessage& operator<<(CMessage& msg, CRegistry& registry)
133  {
134      msg.push(registry) ;
135      return msg ;
136  }
137
138  inline CMessage& operator<<(CMessage& msg, const CRegistry& registry)
139  {
140      msg.push(registry) ;
141      return msg ;
142  }
143
144}
145
146#endif
Note: See TracBrowser for help on using the repository browser.