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