LLVM  8.0.1
circular_raw_ostream.cpp
Go to the documentation of this file.
1 //===- circular_raw_ostream.cpp - Implement circular_raw_ostream ----------===//
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 // This implements support for circular buffered streams.
11 //
12 //===----------------------------------------------------------------------===//
13 
15 #include <algorithm>
16 using namespace llvm;
17 
18 void circular_raw_ostream::write_impl(const char *Ptr, size_t Size) {
19  if (BufferSize == 0) {
20  TheStream->write(Ptr, Size);
21  return;
22  }
23 
24  // Write into the buffer, wrapping if necessary.
25  while (Size != 0) {
26  unsigned Bytes =
27  std::min(unsigned(Size), unsigned(BufferSize - (Cur - BufferArray)));
28  memcpy(Cur, Ptr, Bytes);
29  Size -= Bytes;
30  Cur += Bytes;
31  if (Cur == BufferArray + BufferSize) {
32  // Reset the output pointer to the start of the buffer.
33  Cur = BufferArray;
34  Filled = true;
35  }
36  }
37 }
38 
40  if (BufferSize != 0) {
41  // Write out the buffer
42  TheStream->write(Banner, std::strlen(Banner));
43  flushBuffer();
44  }
45 }
This class represents lattice values for constants.
Definition: AllocatorList.h:24
raw_ostream & write(unsigned char C)
void flushBufferWithBanner()
flushBufferWithBanner - Force output of the buffer along with a small header.
uint32_t Size
Definition: Profile.cpp:47