//===- ELFSegmentFactory.cpp ----------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "mcld/LD/ELFSegmentFactory.h" #include "mcld/LD/ELFSegment.h" namespace mcld { //===----------------------------------------------------------------------===// // ELFSegmentFactory //===----------------------------------------------------------------------===// ELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear) { iterator segment, segEnd = end(); for (segment = begin(); segment != segEnd; ++segment) { if ((*segment)->type() == pType && ((*segment)->flag() & pFlagSet) == pFlagSet && ((*segment)->flag() & pFlagClear) == 0x0) { return segment; } } return segEnd; } ELFSegmentFactory::const_iterator ELFSegmentFactory::find( uint32_t pType, uint32_t pFlagSet, uint32_t pFlagClear) const { const_iterator segment, segEnd = end(); for (segment = begin(); segment != segEnd; ++segment) { if ((*segment)->type() == pType && ((*segment)->flag() & pFlagSet) == pFlagSet && ((*segment)->flag() & pFlagClear) == 0x0) { return segment; } } return segEnd; } ELFSegmentFactory::iterator ELFSegmentFactory::find(uint32_t pType, const LDSection* pSection) { iterator segment, segEnd = end(); for (segment = begin(); segment != segEnd; ++segment) { if ((*segment)->type() == pType) { ELFSegment::iterator sect, sectEnd = (*segment)->end(); for (sect = (*segment)->begin(); sect != sectEnd; ++sect) { if (*sect == pSection) return segment; } // for each section } } // for each segment return segEnd; } ELFSegmentFactory::const_iterator ELFSegmentFactory::find( uint32_t pType, const LDSection* pSection) const { const_iterator segment, segEnd = end(); for (segment = begin(); segment != segEnd; ++segment) { if ((*segment)->type() == pType) { ELFSegment::const_iterator sect, sectEnd = (*segment)->end(); for (sect = (*segment)->begin(); sect != sectEnd; ++sect) { if (*sect == pSection) return segment; } // for each section } } // for each segment return segEnd; } ELFSegment* ELFSegmentFactory::produce(uint32_t pType, uint32_t pFlag) { m_Segments.push_back(ELFSegment::Create(pType, pFlag)); return back(); } ELFSegment* ELFSegmentFactory::insert(iterator pPosition, uint32_t pType, uint32_t pFlag) { return *(m_Segments.insert(pPosition, ELFSegment::Create(pType, pFlag))); } void ELFSegmentFactory::erase(iterator pSegment) { m_Segments.erase(pSegment); } } // namespace mcld