@@ -47,30 +47,12 @@ class Shape
4747 // Constructor that takes a dimension count.
4848 // If dimensions_count <= kMaxSmallSize, it uses a fixed-size array.
4949 // Otherwise, it uses a dynamic vector.
50- explicit Shape (int dimensions_count) : _size(dimensions_count)
51- {
52- if (dimensions_count <= kMaxSmallSize )
53- {
54- dims_ = std::array<int32_t , kMaxSmallSize >{};
55- }
56- else
57- {
58- dims_ = std::vector<int32_t >(dimensions_count);
59- }
60- }
50+ explicit Shape (int dimensions_count) : _size(dimensions_count) { initStorage (dimensions_count); }
6151
6252 // Constructor that creates a shape of given size and fills all dimensions with "value".
6353 Shape (int shape_size, int32_t value) : _size(0 )
6454 {
65- if (shape_size <= kMaxSmallSize )
66- {
67- dims_ = std::array<int32_t , kMaxSmallSize >{};
68- }
69- else
70- {
71- dims_ = std::vector<int32_t >(shape_size);
72- }
73-
55+ initStorage (shape_size);
7456 for (int i = 0 ; i < shape_size; ++i)
7557 {
7658 SetDim (i, value);
@@ -80,16 +62,7 @@ class Shape
8062 // Constructor that creates a shape from an array of dimension data.
8163 Shape (int dimensions_count, const int32_t *dims_data) : _size(0 )
8264 {
83- // Explicitly initialize dims_ based on dimensions_count to avoid uninitialized state.
84- if (dimensions_count <= kMaxSmallSize )
85- {
86- dims_ = std::array<int32_t , kMaxSmallSize >{};
87- }
88- else
89- {
90- dims_ = std::vector<int32_t >(dimensions_count);
91- }
92-
65+ initStorage (dimensions_count);
9366 ReplaceWith (dimensions_count, dims_data);
9467 }
9568
@@ -98,18 +71,7 @@ class Shape
9871 Shape (const std::initializer_list<int > init_list) : _size(0 )
9972 {
10073 const auto size = static_cast <int >(std::distance (init_list.begin (), init_list.end ()));
101-
102- // Explicitly initialize dims_ based on the initializer list size to prevent
103- // "maybe uninitialized" warnings when BuildFrom() is invoked.
104- if (size <= kMaxSmallSize )
105- {
106- dims_ = std::array<int32_t , kMaxSmallSize >{};
107- }
108- else
109- {
110- dims_ = std::vector<int32_t >(size);
111- }
112-
74+ initStorage (size);
11375 BuildFrom (init_list);
11476 }
11577
@@ -207,10 +169,7 @@ class Shape
207169 // initialize dims_ explicitly based on dimensions_count to ensure it is in a valid state.
208170 if (dims_.valueless_by_exception ())
209171 {
210- if (dimensions_count <= kMaxSmallSize )
211- dims_ = std::array<int32_t , kMaxSmallSize >{};
212- else
213- dims_ = std::vector<int32_t >(dimensions_count);
172+ initStorage (dimensions_count);
214173 }
215174
216175 std::vector<int32_t > oldDims;
@@ -304,21 +263,31 @@ class Shape
304263 bool operator !=(const Shape &comp) const { return !((*this ) == comp); }
305264
306265private:
266+ // Helper function: initialize dims_ storage based on the number of dimensions.
267+ inline void initStorage (int dimensions_count)
268+ {
269+ if (dimensions_count <= kMaxSmallSize )
270+ dims_ = std::array<int32_t , kMaxSmallSize >{};
271+ else
272+ dims_ = std::vector<int32_t >(dimensions_count);
273+ }
274+
307275 // For use only by ExtendedShape(), written to guarantee (return-value) copy
308276 // elision in C++17.
309277 // This creates a shape padded to the desired size with the specified value.
310278 Shape (int new_shape_size, const Shape &shape, int pad_value) : _size(0 )
311279 {
312280 assert (new_shape_size >= shape.DimensionsCount ());
313281 assert (new_shape_size <= kMaxSmallSize );
314- Resize (new_shape_size);
282+ initStorage (new_shape_size);
315283 const int size_increase = new_shape_size - shape.DimensionsCount ();
316284 for (int i = 0 ; i < size_increase; ++i)
317285 {
318286 SetDim (i, pad_value);
319287 }
320288 std::memcpy (DimsData () + size_increase, shape.DimsData (),
321289 sizeof (int32_t ) * shape.DimensionsCount ());
290+ _size = new_shape_size;
322291 }
323292
324293 int32_t _size;
0 commit comments