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