| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ART_RUNTIME_INDENTER_H_ |
| #define ART_RUNTIME_INDENTER_H_ |
| |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include <streambuf> |
| |
| const char kIndentChar =' '; |
| const size_t kIndentBy1Count = 2; |
| |
| class Indenter : public std::streambuf { |
| public: |
| Indenter(std::streambuf* out, char text, size_t count) |
| : indent_next_(true), out_sbuf_(out), text_(text), count_(count) {} |
| |
| private: |
| int_type overflow(int_type c) { |
| if (UNLIKELY(c == std::char_traits<char>::eof())) { |
| out_sbuf_->pubsync(); |
| return c; |
| } |
| if (indent_next_) { |
| for (size_t i = 0; i < count_; ++i) { |
| int_type r = out_sbuf_->sputc(text_); |
| if (UNLIKELY(r != text_)) { |
| out_sbuf_->pubsync(); |
| r = out_sbuf_->sputc(text_); |
| CHECK_EQ(r, text_) << "Error writing to buffer. Disk full?"; |
| } |
| } |
| } |
| indent_next_ = (c == '\n'); |
| int_type r = out_sbuf_->sputc(c); |
| if (UNLIKELY(r != c)) { |
| out_sbuf_->pubsync(); |
| r = out_sbuf_->sputc(c); |
| CHECK_EQ(r, c) << "Error writing to buffer. Disk full?"; |
| } |
| return r; |
| } |
| |
| int sync() { |
| return out_sbuf_->pubsync(); |
| } |
| |
| bool indent_next_; |
| |
| // Buffer to write output to. |
| std::streambuf* const out_sbuf_; |
| |
| // Text output as indent. |
| const char text_; |
| |
| // Number of times text is output. |
| const size_t count_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Indenter); |
| }; |
| |
| #endif // ART_RUNTIME_INDENTER_H_ |