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 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 
     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 
     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 
     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 
     77 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