14 #ifndef SST_CORE_SPARSEVECTORMAP_H
15 #define SST_CORE_SPARSEVECTORMAP_H
17 #include "sst/core/serialization/serializable.h"
18 #include "sst/core/sst_types.h"
42 template <
typename keyT,
typename classT = keyT>
56 std::vector<classT> data;
57 int binary_search_insert(keyT
id)
const
62 int size = data.size();
65 if (
size == 0 )
return 0;
66 if (
id > data[
size - 1].key() )
return size;
67 if (
id < data[0].key() )
return 0;
73 while ( bottom <= top ) {
74 middle = bottom + (top - bottom) / 2;
75 if (
id == data[middle].key() )
return -1;
76 if (
id < data[middle].key() ) {
80 if (
id > data[middle - 1].key() )
103 int binary_search_find(keyT
id)
const
106 int top = data.size() - 1;
109 if ( data.size() == 0 )
return -1;
110 while ( bottom <= top ) {
111 middle = bottom + (top - bottom) / 2;
112 if (
id == data[middle].key() )
114 else if (
id < data[middle].key() )
147 std::sort(data.begin(), data.end, [](
const classT& lhs,
const classT& rhs) ->
bool {
148 return lhs.key() < rhs.key();
153 typedef typename std::vector<classT>::iterator iterator;
154 typedef typename std::vector<classT>::const_iterator const_iterator;
168 int index = binary_search_insert(val.key());
169 if ( index == -1 )
return data[binary_search_find(val.key())];
170 iterator it = data.begin();
172 data.insert(it, val);
181 iterator
begin() {
return data.begin(); }
188 iterator
end() {
return data.end(); }
195 const_iterator
begin()
const {
return data.begin(); }
202 const_iterator
end()
const {
return data.end(); }
213 if ( binary_search_find(
id) == -1 )
return false;
229 int index = binary_search_find(
id);
249 int index = binary_search_find(
id);
266 size_t size() {
return data.size(); }
299 template <
typename keyT,
typename classT>
313 std::vector<classT*> data;
314 int binary_search_insert(keyT
id)
const
319 int size = data.size();
322 if ( size == 0 )
return 0;
323 if (
id > data[size - 1]->key() )
return size;
324 if (
id < data[0]->key() )
return 0;
330 while ( bottom <= top ) {
331 middle = bottom + (top - bottom) / 2;
332 if (
id == data[middle]->key() )
return -1;
333 if (
id < data[middle]->key() ) {
337 if (
id > data[middle - 1]->key() )
360 int binary_search_find(keyT
id)
const
363 int top = data.size() - 1;
366 if ( data.size() == 0 )
return -1;
367 while ( bottom <= top ) {
368 middle = bottom + (top - bottom) / 2;
369 if (
id == data[middle]->key() )
371 else if (
id < data[middle]->key() )
404 std::sort(data.begin(), data.end, [](
const classT* lhs,
const classT* rhs) ->
bool {
405 return lhs->key() < rhs->key();
410 typedef typename std::vector<classT*>::iterator iterator;
411 typedef typename std::vector<classT*>::const_iterator const_iterator;
425 int index = binary_search_insert(val->key());
426 if ( index == -1 )
return data[binary_search_find(val->key())];
427 iterator it = data.begin();
429 data.insert(it, val);
438 iterator
begin() {
return data.begin(); }
445 iterator
end() {
return data.end(); }
452 const_iterator
begin()
const {
return data.begin(); }
459 const_iterator
end()
const {
return data.end(); }
470 if ( binary_search_find(
id) == -1 )
return false;
486 int index = binary_search_find(
id);
506 int index = binary_search_find(
id);
523 size_t size() {
return data.size(); }
541 template <
typename filterT>
545 for (
size_t i = 0; i < data.size(); ++i ) {
546 auto key = data[i]->key();
547 data[write_ptr] = filt(data[i]);
548 if ( data[write_ptr] !=
nullptr ) {
550 if ( UNLIKELY(data[write_ptr]->key() != key) ) {
553 "ERROR: Filter object passed to SparseVectorMap::filter returned an object that had a "
554 "different value of key() than what was passed into the filter. The filter object must return "
555 "either an object with the same value of key(), or nullptr if the object should be removed.");
565 data.resize(write_ptr);
566 data.shrink_to_fit();
576 template <
typename keyT>
590 std::vector<keyT> data;
591 int binary_search_insert(keyT
id)
const
596 int size = data.size();
599 if (
size == 0 )
return 0;
600 if (
id < data[0] )
return 0;
601 if (
id > data[
size - 1] )
return size;
607 while ( bottom <= top ) {
608 middle = bottom + (top - bottom) / 2;
609 if (
id == data[middle] )
return -1;
610 if (
id < data[middle] ) {
614 if (
id > data[middle - 1] )
637 int binary_search_find(keyT
id)
const
640 int top = data.size() - 1;
643 if ( data.size() == 0 )
return -1;
644 while ( bottom <= top ) {
645 middle = bottom + (top - bottom) / 2;
646 if (
id == data[middle] )
648 else if (
id < data[middle] )
681 std::sort(data.begin(), data.end, [](
const keyT& lhs,
const keyT& rhs) ->
bool { return lhs < rhs; });
685 typedef typename std::vector<keyT>::iterator iterator;
686 typedef typename std::vector<keyT>::const_iterator const_iterator;
700 int index = binary_search_insert(val);
701 if ( index == -1 )
return data[binary_search_find(val)];
702 iterator it = data.begin();
704 data.insert(it, val);
713 iterator
begin() {
return data.begin(); }
720 iterator
end() {
return data.end(); }
727 const_iterator
begin()
const {
return data.begin(); }
734 const_iterator
end()
const {
return data.end(); }
745 if ( binary_search_find(
id) == -1 )
return false;
761 int index = binary_search_find(
id);
781 int index = binary_search_find(
id);
798 size_t size() {
return data.size(); }
805 namespace Serialization {
807 template <
typename keyT,
typename classT>
A Configuration Graph A graph representing Components and Links.
Definition: configGraph.h:390
Base serialize class.
Definition: serialize.h:32
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:35
size_t size()
Returns the number of items in the SparseVectorMap.
Definition: sparseVectorMap.h:523
iterator end()
Returns the end iterator to the underlying vector.
Definition: sparseVectorMap.h:445
iterator begin()
Returns the begin iterator to the underlying vector.
Definition: sparseVectorMap.h:438
void filter(filterT &filt)
Function to filter the contents of the SparseVectorMap.
Definition: sparseVectorMap.h:542
SparseVectorMap(std::vector< classT * > &new_data, bool sorted=false)
Constructor that allows you to pass an already filled in array with data.
Definition: sparseVectorMap.h:400
bool contains(keyT id) const
Checks if the provided id is found in the SparseVectorMap.
Definition: sparseVectorMap.h:468
void clear()
Clears the contents of the SparseVectorMap.
Definition: sparseVectorMap.h:516
const_iterator begin() const
Returns the const begin iterator to the underlying vector.
Definition: sparseVectorMap.h:452
classT * insert(classT *val)
Insert new value into SparseVectorMap.
Definition: sparseVectorMap.h:423
classT * operator[](keyT id)
Operator returns a reference to data with the specified id.
Definition: sparseVectorMap.h:484
SparseVectorMap()
Default constructor for SparseVectorMap.
Definition: sparseVectorMap.h:385
const classT * operator[](keyT id) const
Operator returns a const reference to data with the specified id.
Definition: sparseVectorMap.h:504
const_iterator end() const
Returns the const end iterator to the underlying vector.
Definition: sparseVectorMap.h:459
const_iterator begin() const
Returns the const begin iterator to the underlying vector.
Definition: sparseVectorMap.h:727
size_t size()
Returns the number of items in the SparseVectorMap.
Definition: sparseVectorMap.h:798
keyT & operator[](keyT id)
Operator returns a reference to data with the specified id.
Definition: sparseVectorMap.h:759
void clear()
Clears the contents of the SparseVectorMap.
Definition: sparseVectorMap.h:791
const_iterator end() const
Returns the const end iterator to the underlying vector.
Definition: sparseVectorMap.h:734
iterator end()
Returns the end iterator to the underlying vector.
Definition: sparseVectorMap.h:720
keyT & insert(const keyT &val)
Insert new value into SparseVectorMap.
Definition: sparseVectorMap.h:698
const keyT & operator[](keyT id) const
Operator returns a const reference to data with the specified id.
Definition: sparseVectorMap.h:779
iterator begin()
Returns the begin iterator to the underlying vector.
Definition: sparseVectorMap.h:713
SparseVectorMap(std::vector< keyT > &new_data, bool sorted=false)
Constructor that allows you to pass an already filled in array with data.
Definition: sparseVectorMap.h:677
SparseVectorMap()
Default constructor for SparseVectorMap.
Definition: sparseVectorMap.h:662
bool contains(keyT id)
Checks if the provided id is found in the SparseVectorMap.
Definition: sparseVectorMap.h:743
Class that stores data in a vector, but can access the data similar to a map.
Definition: sparseVectorMap.h:44
classT & insert(const classT &val)
Insert new value into SparseVectorMap.
Definition: sparseVectorMap.h:166
const_iterator begin() const
Returns the const begin iterator to the underlying vector.
Definition: sparseVectorMap.h:195
const_iterator end() const
Returns the const end iterator to the underlying vector.
Definition: sparseVectorMap.h:202
SparseVectorMap()
Default constructor for SparseVectorMap.
Definition: sparseVectorMap.h:128
iterator end()
Returns the end iterator to the underlying vector.
Definition: sparseVectorMap.h:188
iterator begin()
Returns the begin iterator to the underlying vector.
Definition: sparseVectorMap.h:181
bool contains(keyT id) const
Checks if the provided id is found in the SparseVectorMap.
Definition: sparseVectorMap.h:211
void clear()
Clears the contents of the SparseVectorMap.
Definition: sparseVectorMap.h:259
classT & operator[](keyT id)
Operator returns a reference to data with the specified id.
Definition: sparseVectorMap.h:227
const classT & operator[](keyT id) const
Operator returns a const reference to data with the specified id.
Definition: sparseVectorMap.h:247
SparseVectorMap(std::vector< classT > &new_data, bool sorted=false)
Constructor that allows you to pass an already filled in array with data.
Definition: sparseVectorMap.h:143
size_t size()
Returns the number of items in the SparseVectorMap.
Definition: sparseVectorMap.h:266
Exception that is thrown by SparseVectorMap::filter() if the filtering object returns an object that ...
Definition: sparseVectorMap.h:276