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