text: ﻿/***********************************************************************//**
  	@file
  ***************************************************************************/
  #include "Output.hpp"
  /***********************************************************************//**
  	@brief コンストラクタ
  ***************************************************************************/
  Output::Output()
    : isNewline_(true), 
      indent_(0)
  {
  }
  /***********************************************************************//**
  	@brief デストラクタ
  ***************************************************************************/
  Output::~Output() {
    assert(indent_ == 0);
    close();
  }
  /***********************************************************************//**
  	@brief 
  ***************************************************************************/
  bool Output::open(const std::string& filename) {
    close();
    stream_.reset(new std::ofstream(filename, std::ios::out));
    if(stream_->fail()) {
      stream_.reset();
      return false;
    }
    return true;
  }
  /***********************************************************************//**
  	@brief 
  ***************************************************************************/
  void Output::close() {
    stream_.reset();
  }
  /***********************************************************************//**
  	@brief 
  ***************************************************************************/
  Output& Output::operator<<(char control) {
    switch(control) {
    case '\n':
      enter();
      break;
    case '{':
      *this << "{";
      indent_ += INDENT;
      enter();
      break;
    case '}':
      indent_ -= INDENT;
      *this << "}";
      break;
    case '-':
      getStream() << std::string(indent_ - (INDENT / 2), ' ');
      isNewline_ = false;
      break;
    default:
      assert(0);
      break;
    }
    return *this;
  }
  /***********************************************************************//**
  	@brief 
  ***************************************************************************/
  Output& Output::enter() {
    getStream() << std::endl;
    isNewline_ = true;
    return *this;
  }
  /***********************************************************************//**
  	@brief 
  ***************************************************************************/
  std::ostream& Output::getStream() const {
    return stream_ ? *stream_ : std::cout;
  }
  /***********************************************************************//**
  	@brief 
  ***************************************************************************/
  void Output::indent() {
    if(isNewline_) {
      getStream() << std::string(indent_, ' ');
      isNewline_ = false;
    }
  }
  