8#ifndef INCLUDED_BDLCC_OBJECTCATALOG
9#define INCLUDED_BDLCC_OBJECTCATALOG
298#include <bdlscm_version.h>
326#include <bsl_utility.h>
327#include <bsl_vector.h>
329#ifndef BDE_DONT_ALLOW_TRANSITIVE_INCLUDES
339class ObjectCatalog_AutoCleanup;
341class ObjectCatalogIter;
360 bool d_deallocateFlag;
387 bool deallocateFlag);
419 k_INDEX_MASK = 0x007fffff,
420 k_BUSY_INDICATOR = 0x00800000,
421 k_GENERATION_INC = 0x01000000,
422 k_GENERATION_MASK = 0xff000000
441 Node *d_nextFreeNode_p;
461 static TYPE *getNodeValue(Node *node);
470 void freeNode(Node *node);
475 template <
class VECTOR>
476 void removeAllImp(VECTOR *buffer);
482 Node *findNode(
int handle)
const;
505 int add(TYPE
const&
object);
520 int remove(
int handle, TYPE *valueBuffer = 0);
528#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
529 void removeAll(std::pmr::vector<TYPE> *buffer);
535 int replace(
int handle,
const TYPE& newObject);
558 int find(
int handle, TYPE *valueBuffer)
const;
576 "use 'ObjectCatalogIter::value()' instead")
577 const TYPE& value(
int handle) const;
605 bsl::ptrdiff_t d_index;
614 template <
class BDE_OTHER_TYPE>
617 template <
class BDE_OTHER_TYPE>
654 operator const void *()
const;
671 const TYPE& value()
const;
686: d_catalog_p(catalog)
688, d_deallocateFlag(false)
695 if (d_catalog_p && d_node_p) {
696 if (d_deallocateFlag) {
699 d_catalog_p->d_nodePool.deallocate(d_node_p);
703 d_catalog_p->freeNode(d_node_p);
715 d_deallocateFlag = deallocateFlag;
743 return node->d_payload.d_value.address();
749void ObjectCatalog<TYPE>::freeNode(
typename ObjectCatalog<TYPE>::Node *node)
753 node->d_handle += k_GENERATION_INC;
754 node->d_handle &= ~k_BUSY_INDICATOR;
756 node->d_payload.d_next_p = d_nextFreeNode_p;
757 d_nextFreeNode_p = node;
762template <
class VECTOR>
763void ObjectCatalog<TYPE>::removeAllImp(VECTOR *buffer)
765 static const bool isVector =
767#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
777 for (VIt it = d_nodes.
begin(); it != d_nodes.
end(); ++it) {
778 if ((*it)->d_handle & k_BUSY_INDICATOR) {
779 TYPE *value = getNodeValue(*it);
795 d_nextFreeNode_p = 0;
802typename ObjectCatalog<TYPE>::Node *
803ObjectCatalog<TYPE>::findNode(
int handle)
const
805 int index = handle & k_INDEX_MASK;
809 index >= (
int)d_nodes.
size() ||
810 !(handle & k_BUSY_INDICATOR)) {
814 Node *node = d_nodes[index];
816 return node->d_handle == handle ? node : 0;
824, d_nodePool(sizeof(Node), allocator)
846 if (d_nextFreeNode_p) {
847 node = d_nextFreeNode_p;
848 d_nextFreeNode_p = node->d_payload.d_next_p;
858 node =
static_cast<Node *
>(d_nodePool.
allocate());
863 node->d_handle =
static_cast<int>(d_nodes.
size()) - 1;
869 node->d_handle |= k_BUSY_INDICATOR;
870 handle = node->d_handle;
875 getNodeValue(node),
object, d_nodes.
get_allocator().mechanism());
889 TYPE& local = object;
896 if (d_nextFreeNode_p) {
897 node = d_nextFreeNode_p;
898 d_nextFreeNode_p = node->d_payload.d_next_p;
908 node =
static_cast<Node *
>(d_nodePool.
allocate());
913 node->d_handle =
static_cast<int>(d_nodes.
size()) - 1;
919 node->d_handle |= k_BUSY_INDICATOR;
920 handle = node->d_handle;
925 getNodeValue(node), local, d_nodes.
get_allocator().mechanism());
942 Node *node = findNode(handle);
948 TYPE *value = getNodeValue(node);
972 removeAllImp(buffer);
979 removeAllImp(buffer);
982#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_PMR
987 removeAllImp(buffer);
996 Node *node = findNode(handle);
1002 TYPE *value = getNodeValue(node);
1014template <
class TYPE>
1017 TYPE& local = newObject;
1021 Node *node = findNode(handle);
1027 TYPE *value = getNodeValue(node);
1040template <
class TYPE>
1047template <
class TYPE>
1053 return 0 == findNode(handle) ? -1 : 0;
1056template <
class TYPE>
1062 Node *node = findNode(handle);
1068 *valueBuffer = *getNodeValue(node);
1073template <
class TYPE>
1076 for (
Iter it(*
this); it; ++it) {
1077 if (it.value() ==
object) {
1085template <
class TYPE>
1092template <
class TYPE>
1098 Node *node = findNode(handle);
1102 return *getNodeValue(node);
1105template <
class TYPE>
1113 unsigned numBusy = 0, numFree = 0;
1114 for (
unsigned ii = 0; ii < d_nodes.
size(); ++ii) {
1115 const int handle = d_nodes[ii]->d_handle;
1117 handle & k_BUSY_INDICATOR ? ++numBusy
1120 BSLS_ASSERT( numBusy ==
static_cast<unsigned>(d_length));
1123 for (
const Node *p = d_nextFreeNode_p; p; p = p->d_payload.d_next_p) {
1135template <
class TYPE>
1138: d_catalog_p(&catalog)
1141 d_catalog_p->d_lock.lockRead();
1145template <
class TYPE>
1149: d_catalog_p(&catalog)
1152 typedef typename Catalog::Node Node;
1154 d_catalog_p->d_lock.lockRead();
1156 Node *node = d_catalog_p->findNode(
handle);
1157 d_index = node ? node->d_handle & Catalog::k_INDEX_MASK
1161template <
class TYPE>
1165 d_catalog_p->d_lock.unlock();
1169template <
class TYPE>
1173 while ((
unsigned)d_index < d_catalog_p->d_nodes.
size() &&
1174 !(d_catalog_p->d_nodes[d_index]->d_handle &
1180template <
class TYPE>
1184 BSLS_ASSERT(
static_cast<unsigned>(d_index) < d_catalog_p->d_nodes.size());
1186 return d_catalog_p->d_nodes[d_index]->d_handle;
1189template <
class TYPE>
1193 BSLS_ASSERT(
static_cast<unsigned>(d_index) < d_catalog_p->d_nodes.size());
1201template <
class TYPE>
1205 return static_cast<unsigned>(d_index) < d_catalog_p->d_nodes.size()
1212template <
class TYPE>
1218 typename Catalog::Node *node = d_catalog_p->d_nodes[d_index];
Definition bdlcc_objectcatalog.h:602
~ObjectCatalogIter()
Destroy this iterator and unlock the catalog associated with it.
Definition bdlcc_objectcatalog.h:1163
const TYPE & value() const
Definition bdlcc_objectcatalog.h:1191
void operator++()
Definition bdlcc_objectcatalog.h:1170
int handle() const
Definition bdlcc_objectcatalog.h:1182
bsl::pair< int, TYPE > operator()() const
Definition bdlcc_objectcatalog.h:1214
Definition bdlcc_objectcatalog.h:355
void manageNode(typename ObjectCatalog< TYPE >::Node *node, bool deallocateFlag)
Definition bdlcc_objectcatalog.h:710
void releaseNode()
Definition bdlcc_objectcatalog.h:719
~ObjectCatalog_AutoCleanup()
Definition bdlcc_objectcatalog.h:693
void release()
Definition bdlcc_objectcatalog.h:725
Definition bdlcc_objectcatalog.h:410
int add(TYPE const &object)
Definition bdlcc_objectcatalog.h:839
int replace(int handle, const TYPE &newObject)
Definition bdlcc_objectcatalog.h:992
int find(int handle) const
Definition bdlcc_objectcatalog.h:1049
void removeAll()
Definition bdlcc_objectcatalog.h:963
ObjectCatalog(bslma::Allocator *allocator=0)
Definition bdlcc_objectcatalog.h:822
int remove(int handle, TYPE *valueBuffer=0)
Definition bdlcc_objectcatalog.h:938
int replace(int handle, bslmf::MovableRef< TYPE > newObject)
Definition bdlcc_objectcatalog.h:1015
void removeAll(std::vector< TYPE > *buffer)
Definition bdlcc_objectcatalog.h:977
BSLS_DEPRECATE_FEATURE("bde", "ObjectCataloog::value(handle)", "use 'ObjectCatalogIter::value()' instead") const TYPE &value(int handle) const
bslma::Allocator * allocator() const
Return the allocator used by this object.
Definition bdlcc_objectcatalog.h:1042
int add(bslmf::MovableRef< TYPE > object)
Definition bdlcc_objectcatalog.h:887
BSLMF_NESTED_TRAIT_DECLARATION(ObjectCatalog, bslma::UsesBslmaAllocator)
void removeAll(bsl::vector< TYPE > *buffer)
Definition bdlcc_objectcatalog.h:970
int length() const
Definition bdlcc_objectcatalog.h:1087
~ObjectCatalog()
Destroy this object catalog.
Definition bdlcc_objectcatalog.h:832
bool isMember(const TYPE &object) const
Definition bdlcc_objectcatalog.h:1074
void verifyState() const
Definition bdlcc_objectcatalog.h:1106
int find(int handle, TYPE *valueBuffer) const
Definition bdlcc_objectcatalog.h:1058
Definition bdlma_pool.h:338
bslma::Allocator * allocator() const
Definition bdlma_pool.h:639
void * allocate()
Definition bdlma_pool.h:580
void release()
Relinquish all memory currently allocated via this pool object.
Definition bdlma_pool.h:621
Definition bslstl_pair.h:1280
size_type size() const BSLS_KEYWORD_NOEXCEPT
Return the number of elements in this vector.
Definition bslstl_vector.h:3019
iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2866
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:2874
Definition bslstl_vector.h:1120
allocator_type get_allocator() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:4621
void push_back(const VALUE_TYPE &value)
Definition bslstl_vector.h:4343
VALUE_TYPE * iterator
Definition bslstl_vector.h:1152
void swap(vector &other) BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(AllocatorTraits void clear() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_vector.h:1938
Definition bslma_allocator.h:545
Definition bslmf_movableref.h:752
Definition bslmt_rwmutex.h:148
Definition bslmt_readlockguard.h:287
Definition bslmt_writelockguard.h:221
Definition bsls_atomic.h:744
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_DELETED
Definition bsls_keyword.h:651
#define BSLS_REVIEW_OPT(X)
Definition bsls_review.h:1060
Definition bdlcc_boundedqueue.h:270
BSLS_KEYWORD_CONSTEXPR std::ptrdiff_t ssize(const TYPE(&)[DIMENSION]) BSLS_KEYWORD_NOEXCEPT
Return the dimension of the specified array argument.
Definition bslstl_iterator.h:1492
Definition bslmf_issame.h:146
static void moveConstruct(TARGET_TYPE *address, TARGET_TYPE &original, bslma::Allocator *allocator)
Definition bslalg_scalarprimitives.h:1660
static void copyConstruct(TARGET_TYPE *address, const TARGET_TYPE &original, bslma::Allocator *allocator)
Definition bslalg_scalarprimitives.h:1617
Definition bslma_usesbslmaallocator.h:344
static MovableRef< t_TYPE > move(t_TYPE &reference) BSLS_KEYWORD_NOEXCEPT
Definition bslmf_movableref.h:1067
Definition bdlcc_objectcatalog.h:427
Node * d_next_p
Definition bdlcc_objectcatalog.h:431
bsls::ObjectBuffer< TYPE > d_value
Definition bdlcc_objectcatalog.h:429
Definition bsls_objectbuffer.h:277