-
-
Notifications
You must be signed in to change notification settings - Fork 665
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ENH: Add
itk::MakeFilled<TContainer>(value)
, requested by issue #3230
Discussed extensively at issue #3230 "Create templated function `MakeFilled`", submitted by Lee Newberg in response to issue #3006 "Cannot set image spacing via SpacingType::Filled", by Dženan Zukić.
- Loading branch information
1 parent
6ecb4dc
commit b7715b3
Showing
1 changed file
with
46 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/*========================================================================= | ||
* | ||
* Copyright NumFOCUS | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0.txt | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
* | ||
*=========================================================================*/ | ||
#ifndef itkMakeFilled_h | ||
#define itkMakeFilled_h | ||
|
||
namespace itk | ||
{ | ||
/** Yields a container of the specified type, filled by the specified value, assigned to each of its elements. | ||
* Only intended for container types of a compile-time fixed size, including instances of FixedArray (and derived | ||
* classes), Index, Offset, Size, and std::array. Moreover, their size (number of elements) should be greater than zero. | ||
*/ | ||
template <typename TContainer> | ||
constexpr TContainer | ||
MakeFilled(typename TContainer::const_reference value) | ||
{ | ||
// Note: The seemingly redundant {} initialization is required for C++14 and C++17, in order to declare MakeFilled | ||
// constexpr. (C++20 does allow uninitialized variables in a constexpr function.) | ||
TContainer container{}; | ||
|
||
static_assert(container.size() > 0, "MakeFilled requires TContainer with constant non-zero size!"); | ||
|
||
// Note that `std::fill` and `std::fill_n` are not `constexpr` until C++20. | ||
for (auto & element : container) | ||
{ | ||
element = value; | ||
} | ||
return container; | ||
} | ||
} // namespace itk | ||
|
||
#endif // itkMakeFilled_h |