1a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck//===- InMemoryStruct.h - Indirect Struct Access Smart Pointer --*- C++ -*-===// 2a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck// 3a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck// The LLVM Compiler Infrastructure 4a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck// 5a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck// This file is distributed under the University of Illinois Open Source 6a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck// License. See LICENSE.TXT for details. 7a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck// 8a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck//===----------------------------------------------------------------------===// 9a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck 10a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck#ifndef LLVM_ADT_INMEMORYSTRUCT_H 110b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#define LLVM_ADT_INMEMORYSTRUCT_H 123e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng 13a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck#include <cassert> 14a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck 15a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Pecknamespace llvm { 16a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck 17a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck/// \brief Helper object for abstracting access to an in-memory structure which 18a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck/// may require some kind of temporary storage. 19a70f28ce7dc85d0075a7d86da5d7987b6e306bc6Wesley Peck/// 20/// This class is designed to be used for accessing file data structures which 21/// in the common case can be accessed from a direct pointer to a memory mapped 22/// object, but which in some cases may require indirect access to a temporary 23/// structure (which, for example, may have undergone endianness translation). 24template<typename T> 25class InMemoryStruct { 26 typedef T value_type; 27 typedef value_type &reference; 28 typedef value_type *pointer; 29 typedef const value_type &const_reference; 30 typedef const value_type *const_pointer; 31 32 /// \brief The smart pointer target. 33 value_type *Target; 34 35 /// \brief A temporary object which can be used as a target of the smart 36 /// pointer. 37 value_type Contents; 38 39private: 40 41public: 42 InMemoryStruct() : Target(0) {} 43 InMemoryStruct(reference Value) : Target(&Contents), Contents(Value) {} 44 InMemoryStruct(pointer Value) : Target(Value) {} 45 InMemoryStruct(const InMemoryStruct<T> &Value) { *this = Value; } 46 47 void operator=(const InMemoryStruct<T> &Value) { 48 if (Value.Target != &Value.Contents) { 49 Target = Value.Target; 50 } else { 51 Target = &Contents; 52 Contents = Value.Contents; 53 } 54 } 55 56 const_reference operator*() const { 57 assert(Target && "Cannot dereference null pointer"); 58 return *Target; 59 } 60 reference operator*() { 61 assert(Target && "Cannot dereference null pointer"); 62 return *Target; 63 } 64 65 const_pointer operator->() const { 66 return Target; 67 } 68 pointer operator->() { 69 return Target; 70 } 71 72 operator bool() const { return Target != 0; } 73}; 74 75} 76 77#endif 78