| //===-- Baton.h -------------------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLDB_UTILITY_BATON_H |
| #define LLDB_UTILITY_BATON_H |
| |
| #include "lldb/lldb-enumerations.h" |
| #include "lldb/lldb-public.h" |
| |
| #include "llvm/Support/raw_ostream.h" |
| |
| #include <memory> |
| |
| namespace lldb_private { |
| class Stream; |
| } |
| |
| namespace lldb_private { |
| |
| /// \class Baton Baton.h "lldb/Core/Baton.h" |
| /// A class designed to wrap callback batons so they can cleanup |
| /// any acquired resources |
| /// |
| /// This class is designed to be used by any objects that have a callback |
| /// function that takes a baton where the baton might need to |
| /// free/delete/close itself. |
| /// |
| /// The default behavior is to not free anything. Subclasses can free any |
| /// needed resources in their destructors. |
| class Baton { |
| public: |
| Baton() {} |
| virtual ~Baton() {} |
| |
| virtual void *data() = 0; |
| |
| virtual void GetDescription(llvm::raw_ostream &s, |
| lldb::DescriptionLevel level, |
| unsigned indentation) const = 0; |
| }; |
| |
| class UntypedBaton : public Baton { |
| public: |
| UntypedBaton(void *Data) : m_data(Data) {} |
| ~UntypedBaton() override { |
| // The default destructor for an untyped baton does NOT attempt to clean up |
| // anything in m_data. |
| } |
| |
| void *data() override { return m_data; } |
| void GetDescription(llvm::raw_ostream &s, lldb::DescriptionLevel level, |
| unsigned indentation) const override; |
| |
| void *m_data; // Leave baton public for easy access |
| }; |
| |
| template <typename T> class TypedBaton : public Baton { |
| public: |
| explicit TypedBaton(std::unique_ptr<T> Item) : Item(std::move(Item)) {} |
| |
| T *getItem() { return Item.get(); } |
| const T *getItem() const { return Item.get(); } |
| |
| void *data() override { return Item.get(); } |
| void GetDescription(llvm::raw_ostream &s, lldb::DescriptionLevel level, |
| unsigned indentation) const override {} |
| |
| protected: |
| std::unique_ptr<T> Item; |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // LLDB_UTILITY_BATON_H |