12bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers/*
22bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * Copyright (C) 2012 The Android Open Source Project
32bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers *
42bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * Licensed under the Apache License, Version 2.0 (the "License");
52bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * you may not use this file except in compliance with the License.
62bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * You may obtain a copy of the License at
72bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers *
82bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers *      http://www.apache.org/licenses/LICENSE-2.0
92bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers *
102bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * Unless required by applicable law or agreed to in writing, software
112bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * distributed under the License is distributed on an "AS IS" BASIS,
122bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * See the License for the specific language governing permissions and
142bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers * limitations under the License.
152bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers */
162bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_INDENTER_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_INDENTER_H_
192bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
20761600567d73b23324ae0251e871c15d6849ffd8Elliott Hughes#include "base/macros.h"
212bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers#include <streambuf>
222bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
232bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogersconst char kIndentChar =' ';
242bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogersconst size_t kIndentBy1Count = 2;
252bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
262bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogersclass Indenter : public std::streambuf {
272bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers public:
282bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  Indenter(std::streambuf* out, char text, size_t count)
292bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers      : indent_next_(true), out_sbuf_(out), text_(text), count_(count) {}
302bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
312bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers private:
322bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  int_type overflow(int_type c) {
332bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers    if (c != std::char_traits<char>::eof()) {
342bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers      if (indent_next_) {
352bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers        for (size_t i = 0; i < count_; ++i) {
362bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers          out_sbuf_->sputc(text_);
372bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers        }
382bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers      }
392bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers      out_sbuf_->sputc(c);
402bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers      indent_next_ = (c == '\n');
412bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers    }
422bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers    return std::char_traits<char>::not_eof(c);
432bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  }
442bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
452bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  int sync() {
462bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers    return out_sbuf_->pubsync();
472bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  }
482bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
492bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  bool indent_next_;
502bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
512bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  // Buffer to write output to.
522bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  std::streambuf* const out_sbuf_;
532bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
542bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  // Text output as indent.
552bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  const char text_;
562bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
572bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  // Number of times text is output.
582bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  const size_t count_;
592bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
602bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers  DISALLOW_COPY_AND_ASSIGN(Indenter);
612bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers};
622bcb4a496b7aa00d996df3a070524f7568fb35a1Ian Rogers
63fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_INDENTER_H_
64