1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- HandleToArea.h -----------------------------------------------------===//
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#ifndef MCLD_FILE_HANDLE_TO_MEMORY_AREA_H
10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_FILE_HANDLE_TO_MEMORY_AREA_H
11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifdef ENABLE_UNITTEST
12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <gtest.h>
13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/Uncopyable.h>
15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/TypeTraits.h>
16affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/ADT/StringHash.h>
17affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/Path.h>
18affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileHandle.h>
19affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <vector>
20affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
21f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesnamespace mcld {
22affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
23affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass MemoryArea;
24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
25affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class HandleToArea
26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *
27affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  Special double-key associative container. Keys are Path and file handler,
28affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  associative value is MemoryArea.
29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *
30affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  For high performance, HandleToArea is not designed to contain unique
31affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  <key, value> pair. The key and value may be duplicated.
32affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *
33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  Like FileHandle, HandleToArea should neither throw exception nor call
34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang *  expressive diagnostic.
35affc150dc44fab1911775a49636d0ce85333b634Zonr Chang */
36affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass HandleToArea : private Uncopyable
37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang{
38affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
39affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  struct Bucket {
40affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    unsigned int hash_value;
41affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    FileHandle* handle;
42affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    MemoryArea* area;
43affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
44affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
45affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // the best data structure is a binary search tree.
46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // However, by the shrinking time-to-market constraint, I used
47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // vector and sequential search here.
48affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef std::vector<Bucket> HandleToAreaMap;
49affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
50f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  typedef hash::StringHash<hash::BKDR> HashFunction;
51affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
52affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
53affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef HandleToAreaMap::iterator iterator;
54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  typedef HandleToAreaMap::const_iterator const_iterator;
55affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
56affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
57affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  struct Result {
58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  public:
59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    Result(FileHandle* pHandle, MemoryArea* pArea)
60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      : handle(pHandle), area(pArea) { }
61affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
62affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  public:
63affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    FileHandle* handle;
64affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    MemoryArea* area;
65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
67affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  struct ConstResult {
68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  public:
69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    ConstResult(const FileHandle* pHandle, const MemoryArea* pArea)
70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang      : handle(pHandle), area(pArea) { }
71affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
72affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  public:
73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    const FileHandle* handle;
74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang    const MemoryArea* area;
75affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  };
76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
77affc150dc44fab1911775a49636d0ce85333b634Zonr Changpublic:
78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool push_back(FileHandle* pHandle, MemoryArea* pArea);
79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool erase(MemoryArea* pArea);
81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool erase(const sys::fs::Path& pPath);
83affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
84affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  Result findFirst(const sys::fs::Path& pPath);
85affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ConstResult findFirst(const sys::fs::Path& pPath) const;
87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  iterator begin()
89affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_AreaMap.begin(); }
90affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  iterator end()
92affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_AreaMap.end(); }
93affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
94affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const_iterator begin() const
95affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_AreaMap.begin(); }
96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  const_iterator end() const
98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_AreaMap.end(); }
99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
100affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  // -----  capacity  ----- //
101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  bool empty() const
102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_AreaMap.empty(); }
103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  size_t size() const
105affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  { return m_AreaMap.size(); }
106affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  HandleToArea() : m_AreaMap() { }
108affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  ~HandleToArea() { }
110affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
111affc150dc44fab1911775a49636d0ce85333b634Zonr Changprivate:
112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang  HandleToAreaMap m_AreaMap;
113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang};
114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang} // namespace of mcld
116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#endif
118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang
119