diff options
| author | babenko <[email protected]> | 2022-02-10 16:49:19 +0300 |
|---|---|---|
| committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:49:19 +0300 |
| commit | cec37806d8847aa3db53bafc9e251d4aaf325c12 (patch) | |
| tree | 4a61c191e93e31d9ab423e258c71ab43550ee3d2 /library/cpp/yt/memory/shared_range.h | |
| parent | 58cd0b86ed99a72df22479e26a20bc1c1e57e65e (diff) | |
Restoring authorship annotation for <[email protected]>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/yt/memory/shared_range.h')
| -rw-r--r-- | library/cpp/yt/memory/shared_range.h | 500 |
1 files changed, 250 insertions, 250 deletions
diff --git a/library/cpp/yt/memory/shared_range.h b/library/cpp/yt/memory/shared_range.h index 9841d7a0df4..81a1266ff1b 100644 --- a/library/cpp/yt/memory/shared_range.h +++ b/library/cpp/yt/memory/shared_range.h @@ -1,48 +1,48 @@ -#pragma once - -#include "intrusive_ptr.h" +#pragma once + +#include "intrusive_ptr.h" #include "range.h" #include "ref_counted.h" - -#include <library/cpp/yt/assert/assert.h> - -namespace NYT { - -//////////////////////////////////////////////////////////////////////////////// - + +#include <library/cpp/yt/assert/assert.h> + +namespace NYT { + +//////////////////////////////////////////////////////////////////////////////// + template <class T, size_t N> class TCompactVector; -//! TRange with ownership semantics. -template <class T> -class TSharedRange - : public TRange<T> -{ -public: +//! TRange with ownership semantics. +template <class T> +class TSharedRange + : public TRange<T> +{ +public: using THolderPtr = TRefCountedPtr; - + //! Constructs a null TSharedRange. - TSharedRange() - { } - - //! Constructs a TSharedRange from TRange. - TSharedRange(TRange<T> range, THolderPtr holder) - : TRange<T>(range) - , Holder_(std::move(holder)) - { } - - //! Constructs a TSharedRange from a pointer and length. - TSharedRange(const T* data, size_t length, THolderPtr holder) - : TRange<T>(data, length) - , Holder_(std::move(holder)) - { } - - //! Constructs a TSharedRange from a range. - TSharedRange(const T* begin, const T* end, THolderPtr holder) - : TRange<T>(begin, end) - , Holder_(std::move(holder)) - { } - + TSharedRange() + { } + + //! Constructs a TSharedRange from TRange. + TSharedRange(TRange<T> range, THolderPtr holder) + : TRange<T>(range) + , Holder_(std::move(holder)) + { } + + //! Constructs a TSharedRange from a pointer and length. + TSharedRange(const T* data, size_t length, THolderPtr holder) + : TRange<T>(data, length) + , Holder_(std::move(holder)) + { } + + //! Constructs a TSharedRange from a range. + TSharedRange(const T* begin, const T* end, THolderPtr holder) + : TRange<T>(begin, end) + , Holder_(std::move(holder)) + { } + //! Constructs a TSharedRange from a TCompactVector. template <size_t N> TSharedRange(const TCompactVector<T, N>& elements, THolderPtr holder) @@ -50,99 +50,99 @@ public: , Holder_(std::move(holder)) { } - //! Constructs a TSharedRange from an std::vector. - TSharedRange(const std::vector<T>& elements, THolderPtr holder) - : TRange<T>(elements) - , Holder_(std::move(holder)) - { } - - //! Constructs a TSharedRange from a C array. - template <size_t N> - TSharedRange(const T (& elements)[N], THolderPtr holder) - : TRange<T>(elements) - , Holder_(std::move(holder)) - { } - - - void Reset() - { - TRange<T>::Data_ = nullptr; - TRange<T>::Length_ = 0; - Holder_.Reset(); - } - - TSharedRange<T> Slice(size_t startOffset, size_t endOffset) const - { - YT_ASSERT(startOffset <= this->Size()); - YT_ASSERT(endOffset >= startOffset && endOffset <= this->Size()); - return TSharedRange<T>(this->Begin() + startOffset, endOffset - startOffset, Holder_); - } - - TSharedRange<T> Slice(const T* begin, const T* end) const - { - YT_ASSERT(begin >= this->Begin()); - YT_ASSERT(end <= this->End()); - return TSharedRange<T>(begin, end, Holder_); - } - - const THolderPtr& GetHolder() const - { - return Holder_; - } - + //! Constructs a TSharedRange from an std::vector. + TSharedRange(const std::vector<T>& elements, THolderPtr holder) + : TRange<T>(elements) + , Holder_(std::move(holder)) + { } + + //! Constructs a TSharedRange from a C array. + template <size_t N> + TSharedRange(const T (& elements)[N], THolderPtr holder) + : TRange<T>(elements) + , Holder_(std::move(holder)) + { } + + + void Reset() + { + TRange<T>::Data_ = nullptr; + TRange<T>::Length_ = 0; + Holder_.Reset(); + } + + TSharedRange<T> Slice(size_t startOffset, size_t endOffset) const + { + YT_ASSERT(startOffset <= this->Size()); + YT_ASSERT(endOffset >= startOffset && endOffset <= this->Size()); + return TSharedRange<T>(this->Begin() + startOffset, endOffset - startOffset, Holder_); + } + + TSharedRange<T> Slice(const T* begin, const T* end) const + { + YT_ASSERT(begin >= this->Begin()); + YT_ASSERT(end <= this->End()); + return TSharedRange<T>(begin, end, Holder_); + } + + const THolderPtr& GetHolder() const + { + return Holder_; + } + THolderPtr&& ReleaseHolder() { return std::move(Holder_); } -protected: - THolderPtr Holder_; - -}; - -//////////////////////////////////////////////////////////////////////////////// - -//! Constructs a combined holder instance by taking ownership of a given list of holders. -template <class... THolders> +protected: + THolderPtr Holder_; + +}; + +//////////////////////////////////////////////////////////////////////////////// + +//! Constructs a combined holder instance by taking ownership of a given list of holders. +template <class... THolders> TRefCountedPtr MakeCompositeHolder(THolders&&... holders) -{ - struct THolder - : public TRefCounted - { - std::tuple<typename std::decay<THolders>::type...> Holders; - }; - - auto holder = New<THolder>(); - holder->Holders = std::tuple<THolders...>(std::forward<THolders>(holders)...); - return holder; -} - -template <class T, class TContainer, class... THolders> -TSharedRange<T> DoMakeSharedRange(TContainer&& elements, THolders&&... holders) -{ - struct THolder - : public TRefCounted - { - typename std::decay<TContainer>::type Elements; - std::tuple<typename std::decay<THolders>::type...> Holders; - }; - - auto holder = New<THolder>(); - holder->Holders = std::tuple<THolders...>(std::forward<THolders>(holders)...); - holder->Elements = std::forward<TContainer>(elements); - - auto range = MakeRange<T>(holder->Elements); - +{ + struct THolder + : public TRefCounted + { + std::tuple<typename std::decay<THolders>::type...> Holders; + }; + + auto holder = New<THolder>(); + holder->Holders = std::tuple<THolders...>(std::forward<THolders>(holders)...); + return holder; +} + +template <class T, class TContainer, class... THolders> +TSharedRange<T> DoMakeSharedRange(TContainer&& elements, THolders&&... holders) +{ + struct THolder + : public TRefCounted + { + typename std::decay<TContainer>::type Elements; + std::tuple<typename std::decay<THolders>::type...> Holders; + }; + + auto holder = New<THolder>(); + holder->Holders = std::tuple<THolders...>(std::forward<THolders>(holders)...); + holder->Elements = std::forward<TContainer>(elements); + + auto range = MakeRange<T>(holder->Elements); + return TSharedRange<T>(range, std::move(holder)); -} - -//! Constructs a TSharedRange by taking ownership of an std::vector. -template <class T, class... THolders> -TSharedRange<T> MakeSharedRange(std::vector<T>&& elements, THolders&&... holders) -{ - return DoMakeSharedRange<T>(std::move(elements), std::forward<THolders>(holders)...); -} - +} + +//! Constructs a TSharedRange by taking ownership of an std::vector. +template <class T, class... THolders> +TSharedRange<T> MakeSharedRange(std::vector<T>&& elements, THolders&&... holders) +{ + return DoMakeSharedRange<T>(std::move(elements), std::forward<THolders>(holders)...); +} + //! Constructs a TSharedRange by taking ownership of an TCompactVector. template <class T, size_t N, class... THolders> TSharedRange<T> MakeSharedRange(TCompactVector<T, N>&& elements, THolders&&... holders) @@ -150,65 +150,65 @@ TSharedRange<T> MakeSharedRange(TCompactVector<T, N>&& elements, THolders&&... h return DoMakeSharedRange<T>(std::move(elements), std::forward<THolders>(holders)...); } -//! Constructs a TSharedRange by copying an std::vector. -template <class T, class... THolders> -TSharedRange<T> MakeSharedRange(const std::vector<T>& elements, THolders&&... holders) -{ - return DoMakeSharedRange<T>(elements, std::forward<THolders>(holders)...); -} - -template <class T, class... THolders> -TSharedRange<T> MakeSharedRange(TRange<T> range, THolders&&... holders) -{ - return TSharedRange<T>(range, MakeCompositeHolder(std::forward<THolders>(holders)...)); -} - +//! Constructs a TSharedRange by copying an std::vector. +template <class T, class... THolders> +TSharedRange<T> MakeSharedRange(const std::vector<T>& elements, THolders&&... holders) +{ + return DoMakeSharedRange<T>(elements, std::forward<THolders>(holders)...); +} + +template <class T, class... THolders> +TSharedRange<T> MakeSharedRange(TRange<T> range, THolders&&... holders) +{ + return TSharedRange<T>(range, MakeCompositeHolder(std::forward<THolders>(holders)...)); +} + template <class T, class THolder> TSharedRange<T> MakeSharedRange(TRange<T> range, TIntrusivePtr<THolder> holder) { return TSharedRange<T>(range, std::move(holder)); } -template <class U, class T> -TSharedRange<U> ReinterpretCastRange(const TSharedRange<T>& range) -{ - static_assert(sizeof(T) == sizeof(U), "T and U must have equal sizes."); - return TSharedRange<U>(reinterpret_cast<const U*>(range.Begin()), range.Size(), range.GetHolder()); -}; - -//////////////////////////////////////////////////////////////////////////////// - -//! TMutableRange with ownership semantics. -//! Use with caution :) -template <class T> -class TSharedMutableRange - : public TMutableRange<T> -{ -public: +template <class U, class T> +TSharedRange<U> ReinterpretCastRange(const TSharedRange<T>& range) +{ + static_assert(sizeof(T) == sizeof(U), "T and U must have equal sizes."); + return TSharedRange<U>(reinterpret_cast<const U*>(range.Begin()), range.Size(), range.GetHolder()); +}; + +//////////////////////////////////////////////////////////////////////////////// + +//! TMutableRange with ownership semantics. +//! Use with caution :) +template <class T> +class TSharedMutableRange + : public TMutableRange<T> +{ +public: using THolderPtr = TRefCountedPtr; - - //! Constructs a null TSharedMutableRange. - TSharedMutableRange() - { } - - //! Constructs a TSharedMutableRange from TMutableRange. - TSharedMutableRange(TMutableRange<T> range, THolderPtr holder) - : TMutableRange<T>(range) - , Holder_(std::move(holder)) - { } - - //! Constructs a TSharedMutableRange from a pointer and length. - TSharedMutableRange(T* data, size_t length, THolderPtr holder) - : TMutableRange<T>(data, length) - , Holder_(std::move(holder)) - { } - - //! Constructs a TSharedMutableRange from a range. - TSharedMutableRange(T* begin, T* end, THolderPtr holder) - : TMutableRange<T>(begin, end) - , Holder_(std::move(holder)) - { } - + + //! Constructs a null TSharedMutableRange. + TSharedMutableRange() + { } + + //! Constructs a TSharedMutableRange from TMutableRange. + TSharedMutableRange(TMutableRange<T> range, THolderPtr holder) + : TMutableRange<T>(range) + , Holder_(std::move(holder)) + { } + + //! Constructs a TSharedMutableRange from a pointer and length. + TSharedMutableRange(T* data, size_t length, THolderPtr holder) + : TMutableRange<T>(data, length) + , Holder_(std::move(holder)) + { } + + //! Constructs a TSharedMutableRange from a range. + TSharedMutableRange(T* begin, T* end, THolderPtr holder) + : TMutableRange<T>(begin, end) + , Holder_(std::move(holder)) + { } + //! Constructs a TSharedMutableRange from a TCompactVector. template <size_t N> TSharedMutableRange(TCompactVector<T, N>& elements, THolderPtr holder) @@ -216,82 +216,82 @@ public: , Holder_(std::move(holder)) { } - //! Constructs a TSharedMutableRange from an std::vector. - TSharedMutableRange(std::vector<T>& elements, THolderPtr holder) - : TMutableRange<T>(elements) - , Holder_(std::move(holder)) - { } - - //! Constructs a TSharedMutableRange from a C array. - template <size_t N> - TSharedMutableRange(T (& elements)[N], THolderPtr holder) - : TMutableRange<T>(elements) - , Holder_(std::move(holder)) - { } - - - void Reset() - { - TRange<T>::Data_ = nullptr; - TRange<T>::Length_ = 0; - Holder_.Reset(); - } - - TSharedMutableRange<T> Slice(size_t startOffset, size_t endOffset) const - { - YT_ASSERT(startOffset <= this->Size()); - YT_ASSERT(endOffset >= startOffset && endOffset <= this->Size()); - return TSharedMutableRange<T>(this->Begin() + startOffset, endOffset - startOffset, Holder_); - } - - TSharedMutableRange<T> Slice(T* begin, T* end) const - { - YT_ASSERT(begin >= this->Begin()); - YT_ASSERT(end <= this->End()); - return TSharedMutableRange<T>(begin, end, Holder_); - } - - THolderPtr GetHolder() const - { - return Holder_; - } - + //! Constructs a TSharedMutableRange from an std::vector. + TSharedMutableRange(std::vector<T>& elements, THolderPtr holder) + : TMutableRange<T>(elements) + , Holder_(std::move(holder)) + { } + + //! Constructs a TSharedMutableRange from a C array. + template <size_t N> + TSharedMutableRange(T (& elements)[N], THolderPtr holder) + : TMutableRange<T>(elements) + , Holder_(std::move(holder)) + { } + + + void Reset() + { + TRange<T>::Data_ = nullptr; + TRange<T>::Length_ = 0; + Holder_.Reset(); + } + + TSharedMutableRange<T> Slice(size_t startOffset, size_t endOffset) const + { + YT_ASSERT(startOffset <= this->Size()); + YT_ASSERT(endOffset >= startOffset && endOffset <= this->Size()); + return TSharedMutableRange<T>(this->Begin() + startOffset, endOffset - startOffset, Holder_); + } + + TSharedMutableRange<T> Slice(T* begin, T* end) const + { + YT_ASSERT(begin >= this->Begin()); + YT_ASSERT(end <= this->End()); + return TSharedMutableRange<T>(begin, end, Holder_); + } + + THolderPtr GetHolder() const + { + return Holder_; + } + THolderPtr&& ReleaseHolder() { return std::move(Holder_); } -protected: - THolderPtr Holder_; - -}; - -template <class T, class TContainer, class... THolders> -TSharedMutableRange<T> DoMakeSharedMutableRange(TContainer&& elements, THolders&&... holders) -{ - struct THolder - : public TRefCounted - { - typename std::decay<TContainer>::type Elements; - std::tuple<typename std::decay<THolders>::type...> Holders; - }; - - auto holder = New<THolder>(); - holder->Holders = std::tuple<THolders...>(std::forward<THolders>(holders)...); - holder->Elements = std::forward<TContainer>(elements); - - auto range = TMutableRange<T>(holder->Elements); - - return TSharedMutableRange<T>(range, holder); -} - -//! Constructs a TSharedMutableRange by taking ownership of an std::vector. -template <class T, class... THolders> -TSharedMutableRange<T> MakeSharedMutableRange(std::vector<T>&& elements, THolders&&... holders) -{ - return DoMakeSharedMutableRange<T>(std::move(elements), std::forward<THolders>(holders)...); -} - -//////////////////////////////////////////////////////////////////////////////// - -} // namespace NYT +protected: + THolderPtr Holder_; + +}; + +template <class T, class TContainer, class... THolders> +TSharedMutableRange<T> DoMakeSharedMutableRange(TContainer&& elements, THolders&&... holders) +{ + struct THolder + : public TRefCounted + { + typename std::decay<TContainer>::type Elements; + std::tuple<typename std::decay<THolders>::type...> Holders; + }; + + auto holder = New<THolder>(); + holder->Holders = std::tuple<THolders...>(std::forward<THolders>(holders)...); + holder->Elements = std::forward<TContainer>(elements); + + auto range = TMutableRange<T>(holder->Elements); + + return TSharedMutableRange<T>(range, holder); +} + +//! Constructs a TSharedMutableRange by taking ownership of an std::vector. +template <class T, class... THolders> +TSharedMutableRange<T> MakeSharedMutableRange(std::vector<T>&& elements, THolders&&... holders) +{ + return DoMakeSharedMutableRange<T>(std::move(elements), std::forward<THolders>(holders)...); +} + +//////////////////////////////////////////////////////////////////////////////// + +} // namespace NYT |
