| //===- FragmentRef.h ------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #ifndef MCLD_LD_FRAGMENT_REFERENCE_H |
| #define MCLD_LD_FRAGMENT_REFERENCE_H |
| #ifdef ENABLE_UNITTEST |
| #include <gtest.h> |
| #endif |
| |
| #include <mcld/ADT/SizeTraits.h> |
| #include <mcld/ADT/TypeTraits.h> |
| #include <mcld/LD/Fragment.h> |
| |
| namespace mcld |
| { |
| |
| class Layout; |
| |
| /// compunteFragmentSize - compute the specific Fragment size |
| uint64_t computeFragmentSize(const Layout& pLayout, |
| const Fragment& pFrag); |
| |
| /** \class FragmentRef |
| * \brief FragmentRef is a reference of a Fragment's contetnt. |
| * |
| */ |
| class FragmentRef |
| { |
| public: |
| typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset |
| typedef NonConstTraits<unsigned char>::pointer Address; |
| typedef ConstTraits<unsigned char>::pointer ConstAddress; |
| |
| public: |
| FragmentRef(); |
| FragmentRef(Fragment& pFrag, Offset pOffset = 0); |
| ~FragmentRef(); |
| |
| // ----- modifiers ----- // |
| FragmentRef& assign(const FragmentRef& pCopy); |
| |
| FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0); |
| |
| /// memcpy - copy memory |
| /// copy memory from the fragment to the pDesc. |
| /// @pDest - the destination address |
| /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset] |
| /// @pOffset - additional offset. |
| /// the start address offset from fragment[offset()] |
| void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const; |
| |
| // ----- observers ----- // |
| Fragment* frag() |
| { return m_pFragment; } |
| |
| const Fragment* frag() const |
| { return m_pFragment; } |
| |
| Offset offset() const |
| { return m_Offset; } |
| |
| // ----- dereference ----- // |
| Address deref(); |
| |
| ConstAddress deref() const; |
| |
| Address operator*() |
| { return deref(); } |
| |
| ConstAddress operator*() const |
| { return deref(); } |
| |
| private: |
| Fragment* m_pFragment; |
| Offset m_Offset; |
| }; |
| |
| } // namespace of mcld |
| |
| #endif |
| |