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