HandleToArea.cpp revision affc150dc44fab1911775a49636d0ce85333b634
1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- HandleToArea.cpp ----------------------------------------------------===// 2affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 3affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// The MCLinker Project 4affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 5affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// This file is distributed under the University of Illinois Open Source 6affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// License. See LICENSE.TXT for details. 7affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// 8affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/HandleToArea.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryArea.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <llvm/ADT/StringRef.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 13affc150dc44fab1911775a49636d0ce85333b634Zonr Changusing namespace mcld; 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang// HandleToArea 17affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool HandleToArea::push_back(FileHandle* pHandle, MemoryArea* pArea) 18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (NULL == pHandle || NULL == pArea) 20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 21affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang Bucket bucket; 23affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bucket.hash_value = HashFunction()( 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang llvm::StringRef(pHandle->path().native().c_str(), 25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pHandle->path().native().size())); 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bucket.handle = pHandle; 28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang bucket.area = pArea; 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_AreaMap.push_back(bucket); 30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 33affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool HandleToArea::erase(MemoryArea* pArea) 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (NULL == pArea || NULL == pArea->handler()) 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 38affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return erase(pArea->handler()->path()); 39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 41affc150dc44fab1911775a49636d0ce85333b634Zonr Changbool HandleToArea::erase(const sys::fs::Path& pPath) 42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unsigned int hash_value = HashFunction()( 44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang llvm::StringRef(pPath.native().c_str(), 45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pPath.native().size())); 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang HandleToAreaMap::iterator bucket, bEnd = m_AreaMap.end(); 48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) { 49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (bucket->hash_value == hash_value && bucket->handle->path() == pPath) { 50affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // found 51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang m_AreaMap.erase(bucket); 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return true; 53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 56affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return false; 57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 59affc150dc44fab1911775a49636d0ce85333b634Zonr ChangHandleToArea::Result HandleToArea::findFirst(const sys::fs::Path& pPath) 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unsigned int hash_value = HashFunction()(llvm::StringRef(pPath.native().c_str(), 62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pPath.native().size())); 63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang HandleToAreaMap::iterator bucket, bEnd = m_AreaMap.end(); 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) { 67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (bucket->hash_value == hash_value) { 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (bucket->handle->path() == pPath) { 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return Result(bucket->handle, bucket->area); 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return Result(NULL, NULL); 75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 77affc150dc44fab1911775a49636d0ce85333b634Zonr ChangHandleToArea::ConstResult HandleToArea::findFirst(const sys::fs::Path& pPath) const 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{ 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang unsigned int hash_value = HashFunction()(llvm::StringRef(pPath.native().c_str(), 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang pPath.native().size())); 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang HandleToAreaMap::const_iterator bucket, bEnd = m_AreaMap.end(); 83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) { 85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (bucket->hash_value == hash_value) { 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (bucket->handle->path() == pPath) { 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return ConstResult(bucket->handle, bucket->area); 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return ConstResult(NULL, NULL); 93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} 94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 95