//===- HandleToArea.cpp ----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include <mcld/Support/HandleToArea.h> #include <mcld/Support/MemoryArea.h> #include <llvm/ADT/StringRef.h> using namespace mcld; //===----------------------------------------------------------------------===// // HandleToArea bool HandleToArea::push_back(FileHandle* pHandle, MemoryArea* pArea) { if (NULL == pHandle || NULL == pArea) return false; Bucket bucket; bucket.hash_value = HashFunction()( llvm::StringRef(pHandle->path().native().c_str(), pHandle->path().native().size())); bucket.handle = pHandle; bucket.area = pArea; m_AreaMap.push_back(bucket); return true; } bool HandleToArea::erase(MemoryArea* pArea) { if (NULL == pArea || NULL == pArea->handler()) return false; return erase(pArea->handler()->path()); } bool HandleToArea::erase(const sys::fs::Path& pPath) { unsigned int hash_value = HashFunction()( llvm::StringRef(pPath.native().c_str(), pPath.native().size())); HandleToAreaMap::iterator bucket, bEnd = m_AreaMap.end(); for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) { if (bucket->hash_value == hash_value && bucket->handle->path() == pPath) { // found m_AreaMap.erase(bucket); return true; } } return false; } HandleToArea::Result HandleToArea::findFirst(const sys::fs::Path& pPath) { unsigned int hash_value = HashFunction()(llvm::StringRef(pPath.native().c_str(), pPath.native().size())); HandleToAreaMap::iterator bucket, bEnd = m_AreaMap.end(); for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) { if (bucket->hash_value == hash_value) { if (bucket->handle->path() == pPath) { return Result(bucket->handle, bucket->area); } } } return Result(NULL, NULL); } HandleToArea::ConstResult HandleToArea::findFirst(const sys::fs::Path& pPath) const { unsigned int hash_value = HashFunction()(llvm::StringRef(pPath.native().c_str(), pPath.native().size())); HandleToAreaMap::const_iterator bucket, bEnd = m_AreaMap.end(); for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) { if (bucket->hash_value == hash_value) { if (bucket->handle->path() == pPath) { return ConstResult(bucket->handle, bucket->area); } } } return ConstResult(NULL, NULL); }