Home | History | Annotate | Download | only in LD
      1 //===- FragmentRef.h ------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_LD_FRAGMENT_REFERENCE_H
     10 #define MCLD_LD_FRAGMENT_REFERENCE_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 
     15 #include <mcld/ADT/SizeTraits.h>
     16 #include <mcld/ADT/TypeTraits.h>
     17 #include <mcld/LD/Fragment.h>
     18 
     19 namespace mcld
     20 {
     21 
     22 class Layout;
     23 
     24 /// compunteFragmentSize - compute the specific Fragment size
     25 uint64_t computeFragmentSize(const Layout& pLayout,
     26                              const Fragment& pFrag);
     27 
     28 /** \class FragmentRef
     29  *  \brief FragmentRef is a reference of a Fragment's contetnt.
     30  *
     31  */
     32 class FragmentRef
     33 {
     34 public:
     35   typedef uint64_t Offset; // FIXME: use SizeTraits<T>::Offset
     36   typedef NonConstTraits<unsigned char>::pointer Address;
     37   typedef ConstTraits<unsigned char>::pointer ConstAddress;
     38 
     39 public:
     40   FragmentRef();
     41   FragmentRef(Fragment& pFrag, Offset pOffset = 0);
     42   ~FragmentRef();
     43 
     44   // -----  modifiers  ----- //
     45   FragmentRef& assign(const FragmentRef& pCopy);
     46 
     47   FragmentRef& assign(Fragment& pFrag, Offset pOffset = 0);
     48 
     49   /// memcpy - copy memory
     50   /// copy memory from the fragment to the pDesc.
     51   /// @pDest - the destination address
     52   /// @pNBytes - copies pNBytes from the fragment[offset()+pOffset]
     53   /// @pOffset - additional offset.
     54   ///            the start address offset from fragment[offset()]
     55   void memcpy(void* pDest, size_t pNBytes, Offset pOffset = 0) const;
     56 
     57   // -----  observers  ----- //
     58   Fragment* frag()
     59   { return m_pFragment; }
     60 
     61   const Fragment* frag() const
     62   { return m_pFragment; }
     63 
     64   Offset offset() const
     65   { return m_Offset; }
     66 
     67   // -----  dereference  ----- //
     68   Address deref();
     69 
     70   ConstAddress deref() const;
     71 
     72   Address operator*()
     73   { return deref(); }
     74 
     75   ConstAddress operator*() const
     76   { return deref(); }
     77 
     78 private:
     79   Fragment* m_pFragment;
     80   Offset m_Offset;
     81 };
     82 
     83 } // namespace of mcld
     84 
     85 #endif
     86 
     87