struct iterator
: std::iterator< std::output_iterator_tag, void, void, void, void >
{
+ // イテレータを制作する
iterator( const basic_list_formatter& formatter, Stream& os )
: formatter_(&formatter), os_(&os)
{
// この時点でカウントは負
--formatter_->iterator_count_;
}
-
+
+ // コピーコンストラクタ
iterator( const iterator& src )
: formatter_(src.formatter_), os_(src.os_)
{
+ // イテレータカウントを変更する
if( formatter_->iterator_count_ > 0 )
{
++formatter_->iterator_count_;
}
else
{
- assert( !"basic_list_formatter::iterator::iterator(const iterator&) : sould not get here." );
+ assert( !"sould not get here." );
}
}
}
else if( formatter_->iterator_count_ < 0 )
{
+ // count が負 <==> 閉じる必要はない
++formatter_->iterator_count_;
}
else
{
- assert( !"basic_list_formatter::iterator::~iterator() : sould not get here." );
+ assert( !"sould not get here." );
}
}
+ // 代入演算
iterator& operator=( const iterator& src )
{
- iterator temp(src);
- swap(temp);
+ iterator(src).swap(*this);
return *this;
}
void swap( iterator& other )
// 実際の出力
template< typename T >
- iterator& operator=( const T& val )
+ void output( const T& val ) const
{
if( formatter_->iterator_count_ > 0 )
{
+ // 既に何かが出力された
*os_ << formatter_->delim << val;
}
else if( formatter_->iterator_count_ < 0 )
{
+ // まだなにも出力されてない
*os_ << formatter_->pre << val;
formatter_->iterator_count_ = -formatter_->iterator_count_;
}
else
{
- assert( !"basic_list_formatter::iterator::operator=(const T&) : sould not get here." );
+ assert( !"sould not get here." );
}
- return *this;
}
// 「出力を閉じる」
return *this;
}
- // 参照外しも、前置/後置インクリメントも、何もしない
- iterator& operator*(){ return *this; }
+ // 参照を外した場合、出力用プロキシを作って返す
+ struct output_proxy
+ {
+ const iterator* p;
+ explicit output_proxy( const iterator* p_ )
+ : p( p_ ){}
+
+ // 出力操作
+ template<typename T>
+ output_proxy& operator=( const T& val )
+ {
+ p->output( val );
+ return *this;
+ }
+ };
+ output_proxy operator*() const { return output_proxy(this); }
+
+ // 前置/後置インクリメントは何もしない
iterator& operator++(){ return *this; }
iterator& operator++(int){ return *this; }
{
return iterator<Stream>( *this, os );
}
+ template< typename Stream >
+ friend iterator<Stream> make_iterator( const basic_list_formatter& fmt, Stream& os )
+ {
+ return iterator<Stream>( fmt, os );
+ }
private:
mutable int iterator_count_;