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