12#ifndef SST_CORE_SHARED_SHAREDMAP_H
13#define SST_CORE_SHARED_SHAREDMAP_H
15#include "sst/core/shared/sharedObject.h"
16#include "sst/core/sst_types.h"
24namespace SST::Shared {
30template <
typename keyT,
typename valT>
31class SharedMap :
public SharedObject
33 static_assert(!std::is_pointer_v<valT>,
"Cannot use a pointer type as value with SharedMap");
75 Private::getSimulationOutput().fatal(
76 CALL_INFO, 1,
"ERROR: called initialize() of SharedMap %s more than once\n", obj_name.c_str());
79 data = manager.getSharedObjectData<
Data>(obj_name);
80 int ret = incShareCount(data);
81 data->setVerify(v_type);
86 using const_iterator =
typename std::map<keyT, valT>::const_iterator;
87 using const_reverse_iterator =
typename std::map<keyT, valT>::const_reverse_iterator;
94 inline size_t size()
const {
return data->getSize(); }
101 inline bool empty()
const {
return data->map.empty(); }
109 size_t count(
const keyT& k)
const {
return data->map.count(k); }
118 const_iterator
find(
const keyT& key)
const {
return data->map.find(key); }
123 const_iterator
begin()
const {
return data->map.cbegin(); }
128 const_iterator
end()
const {
return data->map.cend(); }
133 const_reverse_iterator
rbegin()
const {
return data->map.crbegin(); }
138 const_reverse_iterator
rend()
const {
return data->map.crend(); }
147 inline const_iterator
lower_bound(
const keyT& key)
const {
return data->map.lower_bound(key); }
155 inline const_iterator
upper_bound(
const keyT& key)
const {
return data->map.lower_bound(key); }
164 if ( published )
return;
166 incPublishCount(data);
186 inline void write(
const keyT& key,
const valT& value)
189 Private::getSimulationOutput().fatal(
190 CALL_INFO, 1,
"ERROR: write to SharedMap %s after publish() was called\n", data->getName().c_str());
192 return data->write(key, value);
214 inline const valT&
operator[](
const keyT& key)
const {
return data->read(key); }
228 inline const valT&
mutex_read(
const keyT& key)
const {
return data->mutex_read(key); }
230 void serialize_order(
serializer& ser)
override
232 SharedObject::serialize_order(ser);
234 const auto mode = ser.mode();
235 initialized = data !=
nullptr;
237 if ( mode == serializer::MAP )
240 SST_SER(published, SerOption::map_read_only);
241 SST_SER(initialized, SerOption::map_read_only);
244 case serializer::SIZER:
245 case serializer::PACK:
247 if ( !initialized )
return;
248 std::string name = data->
getName();
252 case serializer::UNPACK:
254 if ( !initialized )
return;
257 data = manager.getSharedObjectData<Data>(name);
260 case serializer::MAP:
261 if ( initialized ) SST_SER_NAME(data->map,
"data");
262 ser.mapper().map_hierarchy_end();
267 ImplementSerializable(SharedMap<keyT, valT>)
270 bool published =
false;
271 Data* data =
nullptr;
272 bool initialized =
false;
281 std::map<keyT, valT> map;
282 ChangeSet* change_set;
288 verify(VERIFY_UNINITIALIZED)
290 explicit Data(
const std::string& name) :
293 verify(VERIFY_UNINITIALIZED)
295 if ( Private::getNumRanks().rank > 1 ) {
296 change_set =
new ChangeSet(name);
302 if ( change_set )
delete change_set;
307 if ( v_type != verify && verify != VERIFY_UNINITIALIZED ) {
308 Private::getSimulationOutput().fatal(
309 CALL_INFO, 1,
"ERROR: Two different verify_types specified for SharedMap %s\n", name.c_str());
312 if ( change_set ) change_set->setVerify(v_type);
315 size_t getSize()
const {
return map.size(); }
317 void update_write(
const keyT& key,
const valT& value)
322 auto success = map.insert(std::make_pair(key, value));
323 if ( !success.second ) {
325 if ( verify != NO_VERIFY && value != success.first->second ) {
326 Private::getSimulationOutput().fatal(
327 CALL_INFO, 1,
"ERROR: wrote two different values to same key in SharedMap %s\n", name.c_str());
332 void write(
const keyT& key,
const valT& value)
334 std::lock_guard<std::mutex>
lock(mtx);
335 check_lock_for_write(
"SharedMap");
336 update_write(key, value);
337 if ( change_set ) change_set->addChange(key, value);
346 inline const valT& read(
const keyT& key) {
return map.at(key); }
349 inline const valT& mutex_read(
const keyT& key)
351 std::lock_guard<std::mutex>
lock(mtx);
359 void serialize_order(
serializer& ser)
override
361 SharedObjectData::serialize_order(ser);
371 std::map<keyT, valT> changes;
374 void serialize_order(
serializer& ser)
override
376 SharedObjectChangeSet::serialize_order(ser);
381 ImplementSerializable(SharedMap<keyT, valT>::Data::ChangeSet);
386 SharedObjectChangeSet(),
387 verify(VERIFY_UNINITIALIZED)
389 explicit ChangeSet(
const std::string& name) :
390 SharedObjectChangeSet(name),
391 verify(VERIFY_UNINITIALIZED)
394 void addChange(
const keyT& key,
const valT& value) { changes[key] = value; }
396 void setVerify(
verify_type v_type) { verify = v_type; }
398 void applyChanges(SharedObjectDataManager* manager)
override
400 auto data = manager->getSharedObjectData<Data>(
getName());
401 data->setVerify(verify);
402 for (
auto x : changes ) {
403 data->update_write(x.first, x.second);
407 void clear()
override { changes.clear(); }
Class used to map containers.
Definition objectMap.h:1420
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:43
Definition sharedMap.h:275
virtual SharedObjectChangeSet * getChangeSet() override
Gets the changeset for this data on this rank.
Definition sharedMap.h:356
virtual void resetChangeSet() override
Resets the changeset for this data on this rank.
Definition sharedMap.h:357
const_iterator upper_bound(const keyT &key) const
Returns an iterator pointing to the first element in the container whose key is considered to go afte...
Definition sharedMap.h:155
const_iterator lower_bound(const keyT &key) const
Returns an iterator pointing to the first element in the container whose key is not considered to go ...
Definition sharedMap.h:147
void write(const keyT &key, const valT &value)
Write data to the map.
Definition sharedMap.h:186
const valT & operator[](const keyT &key) const
Read data from the map.
Definition sharedMap.h:214
size_t count(const keyT &k) const
Counts elements with a specific key.
Definition sharedMap.h:109
bool isFullyPublished()
Check whether all instances of this SharedMap have called publish().
Definition sharedMap.h:176
const_iterator find(const keyT &key) const
Searches the container for an element with a key equivalent to k and returns an iterator to it if fou...
Definition sharedMap.h:118
const_reverse_iterator rbegin() const
Get const_reverse_iterator to beginning of underlying map.
Definition sharedMap.h:133
int initialize(const std::string &obj_name, verify_type v_type=FE_VERIFY)
Initialize the SharedMap.
Definition sharedMap.h:72
const_reverse_iterator rend() const
Get const_reverse_iterator to end of underlying map.
Definition sharedMap.h:138
const_iterator begin() const
Get const_iterator to beginning of underlying map.
Definition sharedMap.h:123
bool empty() const
Tests if the map is empty.
Definition sharedMap.h:101
void publish()
Indicate that the calling element has written all the data it plans to write.
Definition sharedMap.h:162
const valT & mutex_read(const keyT &key) const
Read data from the map.
Definition sharedMap.h:228
size_t size() const
Get the size of the map.
Definition sharedMap.h:94
const_iterator end() const
Get const_iterator to end of underlying map.
Definition sharedMap.h:128
This is the base class for holding data on changes made to the shared data on each rank.
Definition sharedObject.h:52
const std::string & getName()
Get the name of the shared data the changeset should be applied to.
Definition sharedObject.h:81
virtual void clear()=0
Clears the data.
const std::string & getName()
Get the name of the SharedObject for this data.
Definition sharedObject.h:108
SharedObjectData(const std::string &name)
Constructor for SharedObjectData.
Definition sharedObject.h:202
void lock()
Called by the core when writing to shared regions is no longer allowed.
Definition sharedObject.h:195
verify_type
Enum of verify types.
Definition sharedObject.h:286