Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
ArraySupport.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
6
8
9 /*
10 ********************************************************************************
11 ************* ArrayBasedContainer<THIS_CONTAINER,BASE_CONTAINER> ***************
12 ********************************************************************************
13 */
14 template <typename THIS_CONTAINER, typename BASE_CONTAINER, bool USING_IREP>
15 template <typename... ARGS>
16 inline ArrayBasedContainer<THIS_CONTAINER, BASE_CONTAINER, USING_IREP>::ArrayBasedContainer (ARGS... args)
17 : BASE_CONTAINER{forward<ARGS> (args)...}
18 {
19 }
20 template <typename THIS_CONTAINER, typename BASE_CONTAINER, bool USING_IREP>
21 inline size_t ArrayBasedContainer<THIS_CONTAINER, BASE_CONTAINER, USING_IREP>::capacity () const
22 {
23 if constexpr (USING_IREP) {
24 using _SafeReadRepAccessor = typename THIS_CONTAINER ::template _SafeReadRepAccessor<typename THIS_CONTAINER::IImplRepBase_>;
25 return _SafeReadRepAccessor{this}._ConstGetRep ().capacity ();
26 }
27 else {
28 using _SafeReadRepAccessor = typename THIS_CONTAINER ::template _SafeReadRepAccessor<typename THIS_CONTAINER::Rep_>;
29 return _SafeReadRepAccessor{this}._ConstGetRep ().fData_.capacity ();
30 }
31 }
32 template <typename THIS_CONTAINER, typename BASE_CONTAINER, bool USING_IREP>
34 {
35 if constexpr (USING_IREP) {
36 using _SafeReadWriteRepAccessor = typename THIS_CONTAINER ::template _SafeReadWriteRepAccessor<typename THIS_CONTAINER::IImplRepBase_>;
37 _SafeReadWriteRepAccessor{this}._GetWriteableRep ().reserve (slotsAlloced);
38 }
39 else {
40 using _SafeReadWriteRepAccessor = typename THIS_CONTAINER ::template _SafeReadWriteRepAccessor<typename THIS_CONTAINER::Rep_>;
41 return _SafeReadWriteRepAccessor{this}._GetWriteableRep ().fData_.reserve (slotsAlloced);
42 }
43 }
44 template <typename THIS_CONTAINER, typename BASE_CONTAINER, bool USING_IREP>
46 {
47 if constexpr (USING_IREP) {
48 using _SafeReadWriteRepAccessor = typename THIS_CONTAINER ::template _SafeReadWriteRepAccessor<typename THIS_CONTAINER::IImplRepBase_>;
49 _SafeReadWriteRepAccessor{this}._GetWriteableRep ().shrink_to_fit ();
50 }
51 else {
52 using _SafeReadWriteRepAccessor = typename THIS_CONTAINER ::template _SafeReadWriteRepAccessor<typename THIS_CONTAINER::Rep_>;
53 return _SafeReadWriteRepAccessor{this}._GetWriteableRep ().fData_.shrink_to_fit ();
54 }
55 }
56
57 /*
58 ********************************************************************************
59 ***** ArrayBasedContainerRepImpl<THIS_CONTAINER_REP, BASE_CONTAINER_REP> *******
60 ********************************************************************************
61 */
62 template <typename THIS_CONTAINER_REP, typename BASE_CONTAINER_REP>
63 template <typename... ARGS>
65 : BASE_CONTAINER_REP{forward<ARGS> (args)...}
66 {
67 }
68 template <typename THIS_CONTAINER_REP, typename BASE_CONTAINER_REP>
70 {
71 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{Debug::UncheckedDynamicCast<THIS_CONTAINER_REP*> (this)->fData_};
72 Debug::UncheckedDynamicCast<THIS_CONTAINER_REP*> (this)->fData_.shrink_to_fit ();
73 Debug::UncheckedDynamicCast<THIS_CONTAINER_REP*> (this)->fChangeCounts_.PerformedChange ();
74 }
75 template <typename THIS_CONTAINER_REP, typename BASE_CONTAINER_REP>
77 {
78 Debug::AssertExternallySynchronizedMutex::ReadContext declareContext{Debug::UncheckedDynamicCast<const THIS_CONTAINER_REP*> (this)->fData_};
79 return Debug::UncheckedDynamicCast<const THIS_CONTAINER_REP*> (this)->fData_.capacity ();
80 }
81 template <typename THIS_CONTAINER_REP, typename BASE_CONTAINER_REP>
82 void ArrayBasedContainerRepImpl<THIS_CONTAINER_REP, BASE_CONTAINER_REP>::reserve (size_t slotsAlloced)
83 {
84 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{Debug::UncheckedDynamicCast<THIS_CONTAINER_REP*> (this)->fData_};
85 Debug::UncheckedDynamicCast<THIS_CONTAINER_REP*> (this)->fData_.reserve (slotsAlloced);
86 Debug::UncheckedDynamicCast<THIS_CONTAINER_REP*> (this)->fChangeCounts_.PerformedChange ();
87 }
88
89}
ArrayBasedContainer is a Stroika implementation detail, but its public methods are fair game and full...
nonvirtual void shrink_to_fit()
Reduce the space used to store the container contents.
CRTP applied when ArrayBasedContainerIRep used.
shared_lock< const AssertExternallySynchronizedMutex > ReadContext
Instantiate AssertExternallySynchronizedMutex::ReadContext to designate an area of code where protect...
unique_lock< AssertExternallySynchronizedMutex > WriteContext
Instantiate AssertExternallySynchronizedMutex::WriteContext to designate an area of code where protec...