blob: 1db45a204956a50bbd8928e2a253cf51bc9b40d6 [file] [log] [blame]
//===- FragmentRef.h ------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_FRAGMENT_FRAGMENTREF_H_
#define MCLD_FRAGMENT_FRAGMENTREF_H_
#include "mcld/ADT/SizeTraits.h"
#include "mcld/ADT/TypeTraits.h"
#include "mcld/Config/Config.h"
#include "mcld/Support/Allocators.h"
namespace mcld {
class Fragment;
class LDSection;
class Layout;
/** \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:
/// Create - create a fragment reference for a given fragment.
///
/// @param pFrag - the given fragment
/// @param pOffset - the offset, can be larger than the fragment, but can not
/// be larger than the section size.
/// @return if the offset is legal, return the fragment reference. Otherwise,
/// return NULL.
static FragmentRef* Create(Fragment& pFrag, uint64_t pOffset);
static FragmentRef* Create(LDSection& pSection, uint64_t pOffset);
/// Clear - clear all generated FragmentRef in the system.
static void Clear();
static FragmentRef* Null();
// ----- 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 ----- //
bool isNull() const { return (this == Null()); }
Fragment* frag() { return m_pFragment; }
const Fragment* frag() const { return m_pFragment; }
Offset offset() const { return m_Offset; }
Offset getOutputOffset() const;
private:
friend FragmentRef& NullFragmentRef();
friend class Chunk<FragmentRef, MCLD_SECTIONS_PER_INPUT>;
friend class Relocation;
FragmentRef();
explicit FragmentRef(Fragment& pFrag, Offset pOffset = 0);
private:
Fragment* m_pFragment;
Offset m_Offset;
static FragmentRef g_NullFragmentRef;
};
} // namespace mcld
#endif // MCLD_FRAGMENT_FRAGMENTREF_H_