@@ -49,28 +49,13 @@ class Shape
4949 // Otherwise, it uses a dynamic vector.
5050 explicit Shape (int dimensions_count) : _size(dimensions_count)
5151 {
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- }
52+ initStorage (dimensions_count);
6053 }
6154
6255 // Constructor that creates a shape of given size and fills all dimensions with "value".
6356 Shape (int shape_size, int32_t value) : _size(0 )
6457 {
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-
58+ initStorage (shape_size);
7459 for (int i = 0 ; i < shape_size; ++i)
7560 {
7661 SetDim (i, value);
@@ -80,16 +65,7 @@ class Shape
8065 // Constructor that creates a shape from an array of dimension data.
8166 Shape (int dimensions_count, const int32_t *dims_data) : _size(0 )
8267 {
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-
68+ initStorage (dimensions_count);
9369 ReplaceWith (dimensions_count, dims_data);
9470 }
9571
@@ -98,18 +74,7 @@ class Shape
9874 Shape (const std::initializer_list<int > init_list) : _size(0 )
9975 {
10076 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-
77+ initStorage (size);
11378 BuildFrom (init_list);
11479 }
11580
@@ -207,10 +172,7 @@ class Shape
207172 // initialize dims_ explicitly based on dimensions_count to ensure it is in a valid state.
208173 if (dims_.valueless_by_exception ())
209174 {
210- if (dimensions_count <= kMaxSmallSize )
211- dims_ = std::array<int32_t , kMaxSmallSize >{};
212- else
213- dims_ = std::vector<int32_t >(dimensions_count);
175+ initStorage (dimensions_count);
214176 }
215177
216178 std::vector<int32_t > oldDims;
@@ -304,21 +266,31 @@ class Shape
304266 bool operator !=(const Shape &comp) const { return !((*this ) == comp); }
305267
306268private:
269+ // Helper function: initialize dims_ storage based on the number of dimensions.
270+ inline void initStorage (int dimensions_count)
271+ {
272+ if (dimensions_count <= kMaxSmallSize )
273+ dims_ = std::array<int32_t , kMaxSmallSize >{};
274+ else
275+ dims_ = std::vector<int32_t >(dimensions_count);
276+ }
277+
307278 // For use only by ExtendedShape(), written to guarantee (return-value) copy
308279 // elision in C++17.
309280 // This creates a shape padded to the desired size with the specified value.
310281 Shape (int new_shape_size, const Shape &shape, int pad_value) : _size(0 )
311282 {
312283 assert (new_shape_size >= shape.DimensionsCount ());
313284 assert (new_shape_size <= kMaxSmallSize );
314- Resize (new_shape_size);
285+ initStorage (new_shape_size);
315286 const int size_increase = new_shape_size - shape.DimensionsCount ();
316287 for (int i = 0 ; i < size_increase; ++i)
317288 {
318289 SetDim (i, pad_value);
319290 }
320291 std::memcpy (DimsData () + size_increase, shape.DimsData (),
321292 sizeof (int32_t ) * shape.DimensionsCount ());
293+ _size = new_shape_size;
322294 }
323295
324296 int32_t _size;
0 commit comments