1 //===- MemoryBufferCache.cpp - Cache for loaded memory buffers ------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "clang/Basic/MemoryBufferCache.h" 11 #include "llvm/Support/MemoryBuffer.h" 12 13 using namespace clang; 14 15 llvm::MemoryBuffer & addBuffer(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)16MemoryBufferCache::addBuffer(llvm::StringRef Filename, 17 std::unique_ptr<llvm::MemoryBuffer> Buffer) { 18 auto Insertion = 19 Buffers.insert({Filename, BufferEntry{std::move(Buffer), NextIndex++}}); 20 assert(Insertion.second && "Already has a buffer"); 21 return *Insertion.first->second.Buffer; 22 } 23 lookupBuffer(llvm::StringRef Filename)24llvm::MemoryBuffer *MemoryBufferCache::lookupBuffer(llvm::StringRef Filename) { 25 auto I = Buffers.find(Filename); 26 if (I == Buffers.end()) 27 return nullptr; 28 return I->second.Buffer.get(); 29 } 30 isBufferFinal(llvm::StringRef Filename)31bool MemoryBufferCache::isBufferFinal(llvm::StringRef Filename) { 32 auto I = Buffers.find(Filename); 33 if (I == Buffers.end()) 34 return false; 35 return I->second.Index < FirstRemovableIndex; 36 } 37 tryToRemoveBuffer(llvm::StringRef Filename)38bool MemoryBufferCache::tryToRemoveBuffer(llvm::StringRef Filename) { 39 auto I = Buffers.find(Filename); 40 assert(I != Buffers.end() && "No buffer to remove..."); 41 if (I->second.Index < FirstRemovableIndex) 42 return true; 43 44 Buffers.erase(I); 45 return false; 46 } 47 finalizeCurrentBuffers()48void MemoryBufferCache::finalizeCurrentBuffers() { FirstRemovableIndex = NextIndex; } 49