12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- #pragma once
- #include <util/generic/typetraits.h>
- #include <new>
- namespace NRangeOps {
- template <class T, bool isTrivial>
- struct TRangeOpsBase {
- static inline void DestroyRange(T* b, T* e) noexcept {
- while (e > b) {
- (--e)->~T();
- }
- }
- static inline void InitializeRange(T* b, T* e) {
- T* c = b;
- try {
- for (; c < e; ++c) {
- new (c) T();
- }
- } catch (...) {
- DestroyRange(b, c);
- throw;
- }
- }
- };
- template <class T>
- struct TRangeOpsBase<T, true> {
- static inline void DestroyRange(T*, T*) noexcept {
- }
- static inline void InitializeRange(T*, T*) noexcept {
- }
- };
- template <class T>
- using TRangeOps = TRangeOpsBase<T, TTypeTraits<T>::IsPod>;
- template <class T>
- static inline void DestroyRange(T* b, T* e) noexcept {
- TRangeOps<T>::DestroyRange(b, e);
- }
- template <class T>
- static inline void InitializeRange(T* b, T* e) {
- TRangeOps<T>::InitializeRange(b, e);
- }
- }
|