Home | History | Annotate | Download | only in Support
      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
     17 //===----------------------------------------------------------------------===//
     18 bool HandleToArea::push_back(FileHandle* pHandle, MemoryArea* pArea)
     19 {
     20   if (NULL == pHandle || NULL == pArea)
     21     return false;
     22 
     23   Bucket bucket;
     24   bucket.hash_value = HashFunction()(
     25                               llvm::StringRef(pHandle->path().native().c_str(),
     26                                               pHandle->path().native().size()));
     27 
     28   bucket.handle = pHandle;
     29   bucket.area = pArea;
     30   m_AreaMap.push_back(bucket);
     31   return true;
     32 }
     33 
     34 bool HandleToArea::erase(MemoryArea* pArea)
     35 {
     36   if (NULL == pArea || NULL == pArea->handler())
     37     return false;
     38 
     39   return erase(pArea->handler()->path());
     40 }
     41 
     42 bool HandleToArea::erase(const sys::fs::Path& pPath)
     43 {
     44   unsigned int hash_value = HashFunction()(
     45                                   llvm::StringRef(pPath.native().c_str(),
     46                                                   pPath.native().size()));
     47 
     48   HandleToAreaMap::iterator bucket, bEnd = m_AreaMap.end();
     49   for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) {
     50     if (bucket->hash_value == hash_value && bucket->handle->path() == pPath) {
     51       // found
     52       m_AreaMap.erase(bucket);
     53       return true;
     54     }
     55   }
     56 
     57   return false;
     58 }
     59 
     60 HandleToArea::Result HandleToArea::findFirst(const sys::fs::Path& pPath)
     61 {
     62   unsigned int hash_value = HashFunction()(llvm::StringRef(pPath.native().c_str(),
     63                                                          pPath.native().size()));
     64 
     65   HandleToAreaMap::iterator bucket, bEnd = m_AreaMap.end();
     66 
     67   for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) {
     68     if (bucket->hash_value == hash_value) {
     69       if (bucket->handle->path() == pPath) {
     70         return Result(bucket->handle, bucket->area);
     71       }
     72     }
     73   }
     74 
     75   return Result(NULL, NULL);
     76 }
     77 
     78 HandleToArea::ConstResult HandleToArea::findFirst(const sys::fs::Path& pPath) const
     79 {
     80   unsigned int hash_value = HashFunction()(llvm::StringRef(pPath.native().c_str(),
     81                                                          pPath.native().size()));
     82 
     83   HandleToAreaMap::const_iterator bucket, bEnd = m_AreaMap.end();
     84 
     85   for (bucket = m_AreaMap.begin(); bucket != bEnd; ++bucket) {
     86     if (bucket->hash_value == hash_value) {
     87       if (bucket->handle->path() == pPath) {
     88         return ConstResult(bucket->handle, bucket->area);
     89       }
     90     }
     91   }
     92 
     93   return ConstResult(NULL, NULL);
     94 }
     95 
     96