| //===- InMemoryStruct.h - Indirect Struct Access Smart Pointer --*- C++ -*-===// | |
| // | |
| // The LLVM Compiler Infrastructure | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_ADT_INMEMORYSTRUCT_H | |
| #define LLVM_ADT_INMEMORYSTRUCT_H | |
| #include <cassert> | |
| namespace llvm { | |
| /// \brief Helper object for abstracting access to an in-memory structure which | |
| /// may require some kind of temporary storage. | |
| /// | |
| /// This class is designed to be used for accessing file data structures which | |
| /// in the common case can be accessed from a direct pointer to a memory mapped | |
| /// object, but which in some cases may require indirect access to a temporary | |
| /// structure (which, for example, may have undergone endianness translation). | |
| template<typename T> | |
| class InMemoryStruct { | |
| typedef T value_type; | |
| typedef value_type &reference; | |
| typedef value_type *pointer; | |
| typedef const value_type &const_reference; | |
| typedef const value_type *const_pointer; | |
| /// \brief The smart pointer target. | |
| value_type *Target; | |
| /// \brief A temporary object which can be used as a target of the smart | |
| /// pointer. | |
| value_type Contents; | |
| private: | |
| public: | |
| InMemoryStruct() : Target(0) {} | |
| InMemoryStruct(reference Value) : Target(&Contents), Contents(Value) {} | |
| InMemoryStruct(pointer Value) : Target(Value) {} | |
| InMemoryStruct(const InMemoryStruct<T> &Value) { *this = Value; } | |
| void operator=(const InMemoryStruct<T> &Value) { | |
| if (Value.Target != &Value.Contents) { | |
| Target = Value.Target; | |
| } else { | |
| Target = &Contents; | |
| Contents = Value.Contents; | |
| } | |
| } | |
| const_reference operator*() const { | |
| assert(Target && "Cannot dereference null pointer"); | |
| return *Target; | |
| } | |
| reference operator*() { | |
| assert(Target && "Cannot dereference null pointer"); | |
| return *Target; | |
| } | |
| const_pointer operator->() const { | |
| return Target; | |
| } | |
| pointer operator->() { | |
| return Target; | |
| } | |
| operator bool() const { return Target != 0; } | |
| }; | |
| } | |
| #endif |