| //===- 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); |
| } |
| |