diff options
author | Matthew Bentham <matthew.bentham@arm.com> | 2020-03-05 23:37:48 +0000 |
---|---|---|
committer | Michele Di Giorgio <michele.digiorgio@arm.com> | 2020-03-10 18:41:04 +0000 |
commit | 758b5ba3e6d22509d4deab3d8b0b9c2f03418130 (patch) | |
tree | c16734e12b105819a919e8015a4d281dffd8817c /support/MemorySupport.h | |
parent | 6b3865ad038d60a126fe1f90df815a480527a29f (diff) | |
download | ComputeLibrary-758b5ba3e6d22509d4deab3d8b0b9c2f03418130.tar.gz |
COMPMID-3069: Improve build time by splitting up ToolchainSupport.h
Split out the parts of ToolchainSupport coming from <memory> and
the parts coming from <string> into their own new header files.
This accounts for 99% of uses of ToolchainSupport, which means that
expensive header files such as arm_neon.h don't need to be included
everywhere.
Knocks about 10% of compilation time off kernel files.
Signed-off-by: Matthew Bentham <matthew.bentham@arm.com>
Change-Id: I2ae718fe766b5ff28608812b0f686f30eeac1b21
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/2852
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Diffstat (limited to 'support/MemorySupport.h')
-rw-r--r-- | support/MemorySupport.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/support/MemorySupport.h b/support/MemorySupport.h new file mode 100644 index 0000000000..5ae5501371 --- /dev/null +++ b/support/MemorySupport.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2017-2020 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef ARM_COMPUTE_SUPPORT_MEMORYSUPPORT +#define ARM_COMPUTE_SUPPORT_MEMORYSUPPORT + +#include <memory> + +namespace arm_compute +{ +namespace support +{ +namespace cpp11 +{ +// std::align is missing in GCC 4.9 +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57350 +inline void *align(std::size_t alignment, std::size_t size, void *&ptr, std::size_t &space) +{ + std::uintptr_t pn = reinterpret_cast<std::uintptr_t>(ptr); + std::uintptr_t aligned = (pn + alignment - 1) & -alignment; + std::size_t padding = aligned - pn; + if(space < size + padding) + { + return nullptr; + } + + space -= padding; + + return ptr = reinterpret_cast<void *>(aligned); +} +} //namespace cpp11 +namespace cpp14 +{ +/** make_unique is missing in CPP11. Re-implement it according to the standard proposal. */ + +/**<Template for single object */ +template <class T> +struct _Unique_if +{ + typedef std::unique_ptr<T> _Single_object; /**< Single object type */ +}; + +/** Template for array */ +template <class T> +struct _Unique_if<T[]> +{ + typedef std::unique_ptr<T[]> _Unknown_bound; /**< Array type */ +}; + +/** Template for array with known bounds (to throw an error). + * + * @note this is intended to never be hit. + */ +template <class T, size_t N> +struct _Unique_if<T[N]> +{ + typedef void _Known_bound; /**< Should never be used */ +}; + +/** Construct a single object and return a unique pointer to it. + * + * @param[in] args Constructor arguments. + * + * @return a unique pointer to the new object. + */ +template <class T, class... Args> +typename _Unique_if<T>::_Single_object +make_unique(Args &&... args) +{ + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); +} + +/** Construct an array of objects and return a unique pointer to it. + * + * @param[in] n Array size + * + * @return a unique pointer to the new array. + */ +template <class T> +typename _Unique_if<T>::_Unknown_bound +make_unique(size_t n) +{ + typedef typename std::remove_extent<T>::type U; + return std::unique_ptr<T>(new U[n]()); +} + +/** It is invalid to attempt to make_unique an array with known bounds. */ +template <class T, class... Args> +typename _Unique_if<T>::_Known_bound +make_unique(Args &&...) = delete; +} // namespace cpp14 +} // namespace support +} // namespace arm_compute +#endif /* ARM_COMPUTE_SUPPORT_MEMORYSUPPORT */ |