yat/utility/OstreamIterator.h

Code
Comments
Other
Rev Date Author Line
3151 23 Dec 13 peter 1 #ifndef _theplu_yat_utility_ostream_iterator_
3151 23 Dec 13 peter 2 #define _theplu_yat_utility_ostream_iterator_
3151 23 Dec 13 peter 3
3151 23 Dec 13 peter 4 // $Id$
3151 23 Dec 13 peter 5
3151 23 Dec 13 peter 6 /*
4359 23 Aug 23 peter 7   Copyright (C) 2013, 2014, 2022 Peter Johansson
3151 23 Dec 13 peter 8
3151 23 Dec 13 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
3151 23 Dec 13 peter 10
3151 23 Dec 13 peter 11   The yat library is free software; you can redistribute it and/or
3151 23 Dec 13 peter 12   modify it under the terms of the GNU General Public License as
3151 23 Dec 13 peter 13   published by the Free Software Foundation; either version 3 of the
3151 23 Dec 13 peter 14   License, or (at your option) any later version.
3151 23 Dec 13 peter 15
3151 23 Dec 13 peter 16   The yat library is distributed in the hope that it will be useful,
3151 23 Dec 13 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
3151 23 Dec 13 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3151 23 Dec 13 peter 19   General Public License for more details.
3151 23 Dec 13 peter 20
3151 23 Dec 13 peter 21   You should have received a copy of the GNU General Public License
3151 23 Dec 13 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
3151 23 Dec 13 peter 23 */
3151 23 Dec 13 peter 24
3151 23 Dec 13 peter 25 #include "yat_assert.h"
3151 23 Dec 13 peter 26
4252 18 Nov 22 peter 27 #include <boost/iterator/function_output_iterator.hpp>
3151 23 Dec 13 peter 28
3153 03 Jan 14 peter 29 #include <functional>
3151 23 Dec 13 peter 30 #include <ostream>
3151 23 Dec 13 peter 31 #include <string>
3151 23 Dec 13 peter 32
3151 23 Dec 13 peter 33 namespace theplu {
3151 23 Dec 13 peter 34 namespace yat {
3151 23 Dec 13 peter 35 namespace utility {
3151 23 Dec 13 peter 36
3151 23 Dec 13 peter 37   // private namespace
3151 23 Dec 13 peter 38   namespace detail {
3151 23 Dec 13 peter 39
3151 23 Dec 13 peter 40     /// \internal class used in OstreamIterator
3151 23 Dec 13 peter 41     template<typename T>
4339 15 Apr 23 peter 42     class OstreamIteratorFunc
3151 23 Dec 13 peter 43     {
3151 23 Dec 13 peter 44     public:
3151 23 Dec 13 peter 45       /// default constructor
3151 23 Dec 13 peter 46       OstreamIteratorFunc(void) : ostream_(NULL), pristine_(true) {}
3151 23 Dec 13 peter 47       /// constructor
3151 23 Dec 13 peter 48       explicit OstreamIteratorFunc(std::ostream& os,
3151 23 Dec 13 peter 49                                    const std::string& delimiter)
3151 23 Dec 13 peter 50         : delimiter_(delimiter), ostream_(&os), pristine_(true) {}
3151 23 Dec 13 peter 51
3151 23 Dec 13 peter 52       /// writes to ostream using operator <<
3151 23 Dec 13 peter 53       void operator()(const T& t)
3151 23 Dec 13 peter 54       {
3151 23 Dec 13 peter 55         YAT_ASSERT(ostream_);
3151 23 Dec 13 peter 56         if (pristine_)
3151 23 Dec 13 peter 57           pristine_ = false;
3151 23 Dec 13 peter 58         else
3151 23 Dec 13 peter 59           *ostream_ << delimiter_;
3151 23 Dec 13 peter 60         *ostream_ << t;
3151 23 Dec 13 peter 61       }
3151 23 Dec 13 peter 62
3151 23 Dec 13 peter 63     private:
3151 23 Dec 13 peter 64       std::string delimiter_;
3151 23 Dec 13 peter 65       std::ostream* ostream_;
3151 23 Dec 13 peter 66       bool pristine_;
3151 23 Dec 13 peter 67       // using compiler generated copy
3151 23 Dec 13 peter 68       // Func(const Func&);
3151 23 Dec 13 peter 69       // Func& operator=(const Func&);
3151 23 Dec 13 peter 70     };
3151 23 Dec 13 peter 71   } // end of namespace detail
3151 23 Dec 13 peter 72
3151 23 Dec 13 peter 73
3151 23 Dec 13 peter 74   /**
3153 03 Jan 14 peter 75      OstreamIterator is an \output_iterator. Just like <a
3153 03 Jan 14 peter 76      href="http://www.sgi.com/tech/stl/ostream_iterator.html">
3153 03 Jan 14 peter 77      std::ostream_iterator</a> it uses \c operator<<(ostream&, T) to
3153 03 Jan 14 peter 78      send formatted output to a particular ostream. While <a
3153 03 Jan 14 peter 79      href="http://www.sgi.com/tech/stl/ostream_iterator.html">
3153 03 Jan 14 peter 80      std::ostream_iterator</a> inserts a string \a delimited after
3153 03 Jan 14 peter 81      each element, OstreamIterator only inserts \a delimiter between
3153 03 Jan 14 peter 82      elements.
3153 03 Jan 14 peter 83
3153 03 Jan 14 peter 84      \code
3153 03 Jan 14 peter 85      vector<int> x(3);
3153 03 Jan 14 peter 86      x[0] = 2;
3153 03 Jan 14 peter 87      x[1] = 3;
3153 03 Jan 14 peter 88      x[2] = 5;
3153 03 Jan 14 peter 89      copy(x.begin(), x.end(), OstreamIterator<int>(cout, ", "));
3153 03 Jan 14 peter 90      \endcode
3153 03 Jan 14 peter 91      which will give output: 2, 3, 5
3153 03 Jan 14 peter 92
3151 23 Dec 13 peter 93      \since New in yat 0.12
3151 23 Dec 13 peter 94   */
3151 23 Dec 13 peter 95   template<typename T>
3151 23 Dec 13 peter 96   class OstreamIterator :
3151 23 Dec 13 peter 97     public boost::function_output_iterator<detail::OstreamIteratorFunc<T> >
3151 23 Dec 13 peter 98   {
3151 23 Dec 13 peter 99   public:
3151 23 Dec 13 peter 100     /**
3151 23 Dec 13 peter 101        \brief Default constructor
3151 23 Dec 13 peter 102
3151 23 Dec 13 peter 103        Creates an iterator that is not dereferencable.
3151 23 Dec 13 peter 104      */
3151 23 Dec 13 peter 105     OstreamIterator(void) {}
3151 23 Dec 13 peter 106
3151 23 Dec 13 peter 107     /**
3151 23 Dec 13 peter 108        \brief Constructor
3153 03 Jan 14 peter 109
3153 03 Jan 14 peter 110        Creates an OstreamIterator such that assignment of `t` through
3153 03 Jan 14 peter 111        it is equivalent to os << delimiter << t just like
3153 03 Jan 14 peter 112        std::ostream_iterator. The exception is that first time
3153 03 Jan 14 peter 113        OstreamIterator is derefenced the delimiter is excluded in
3153 03 Jan 14 peter 114        order to get the desired behaviour that delimiter only occurs
3153 03 Jan 14 peter 115        between elements.
3153 03 Jan 14 peter 116
3153 03 Jan 14 peter 117        \param os ostream to send output
3153 03 Jan 14 peter 118        \param delimiter the delimiting string
3151 23 Dec 13 peter 119     */
3151 23 Dec 13 peter 120     explicit OstreamIterator(std::ostream& os, const std::string& delimiter="")
3151 23 Dec 13 peter 121       : boost::function_output_iterator<detail::OstreamIteratorFunc<T> >(detail::OstreamIteratorFunc<T>(os, delimiter)) {}
3151 23 Dec 13 peter 122
3151 23 Dec 13 peter 123   private:
3151 23 Dec 13 peter 124     // Using compiler generated copy
3151 23 Dec 13 peter 125     //OstreamIterator(const OstreamIterator&);
3151 23 Dec 13 peter 126     //OstreamIterator& operator=(const OstreamIterator&);
3151 23 Dec 13 peter 127   };
3151 23 Dec 13 peter 128
3151 23 Dec 13 peter 129 }}} // of namespace utility, yat, and theplu
3151 23 Dec 13 peter 130
3151 23 Dec 13 peter 131 #endif