OW_IstreamBufIterator.hpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2001-2004 Vintela, Inc. All rights reserved.
00003 *
00004 * Redistribution and use in source and binary forms, with or without
00005 * modification, are permitted provided that the following conditions are met:
00006 *
00007 *  - Redistributions of source code must retain the above copyright notice,
00008 *    this list of conditions and the following disclaimer.
00009 *
00010 *  - Redistributions in binary form must reproduce the above copyright notice,
00011 *    this list of conditions and the following disclaimer in the documentation
00012 *    and/or other materials provided with the distribution.
00013 *
00014 *  - Neither the name of Vintela, Inc. nor the names of its
00015 *    contributors may be used to endorse or promote products derived from this
00016 *    software without specific prior written permission.
00017 *
00018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc. OR THE CONTRIBUTORS
00022 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028 * POSSIBILITY OF SUCH DAMAGE.
00029 *******************************************************************************/
00030 
00035 #ifndef OW_ISTREAMBUFITERATOR_HPP_INCLUDE_GUARD_
00036 #define OW_ISTREAMBUFITERATOR_HPP_INCLUDE_GUARD_
00037 #include "OW_config.h"
00038 #if defined(OW_HAVE_ISTREAM)
00039 #include <istream>
00040 #else
00041 #include <iostream>
00042 #endif
00043 
00044 
00045 namespace OW_NAMESPACE
00046 {
00047 
00053 class IstreamBufIterator
00054 {
00055 public:
00056    class proxy
00057    {
00058       friend class IstreamBufIterator;
00059    public:
00060       char operator*() {  return m_keep; }
00061    private:
00062       proxy(char c) : m_keep(c) {}
00063       char m_keep;
00064    };
00065    IstreamBufIterator() : m_sbuf(0) {}
00066    IstreamBufIterator(std::istream& s) : m_sbuf(s.rdbuf()) {}
00067    IstreamBufIterator(std::streambuf* b) : m_sbuf(b) {}
00068    char operator*() const
00069    {
00070       if (m_sbuf)
00071       {
00072          return (m_sbuf->sgetc());
00073       }
00074       else
00075       {
00076          return 0;
00077       }
00078    }
00079    IstreamBufIterator& operator++()
00080    {
00081       m_sbuf->sbumpc();
00082       if (m_sbuf->sgetc() == EOF)
00083       {
00084          m_sbuf = 0;
00085       }
00086       return *this;
00087    }
00088    proxy operator++(int)
00089    {
00090       proxy temp(m_sbuf->sgetc());
00091       m_sbuf->sbumpc();
00092       if (m_sbuf->sgetc() == EOF)
00093       {
00094          m_sbuf = 0;
00095       }
00096       return temp;
00097    }
00098    
00099    bool equal(const IstreamBufIterator& b) const
00100    {
00101       return (m_sbuf == 0) ^ (b.m_sbuf != 0);   // do a little manual strength reduction
00102 //         if (((m_sbuf == 0) && (b.m_sbuf == 0)) || ((m_sbuf != 0) && (b.m_sbuf != 0)))
00103 //         {
00104 //             return true;
00105 //         }
00106 //         else
00107 //         {
00108 //             return false;
00109 //         }
00110    }
00111 private:
00112    std::streambuf* m_sbuf;
00113 };
00114 inline bool operator==(const IstreamBufIterator& lhs, const IstreamBufIterator& rhs)
00115 {
00116    return lhs.equal(rhs);
00117 }
00118 inline bool operator!=(const IstreamBufIterator& lhs, const IstreamBufIterator& rhs)
00119 {
00120    return !lhs.equal(rhs);
00121 }
00122 
00123 } // end namespace OW_NAMESPACE
00124 
00125 #endif

Generated on Thu Feb 9 08:48:01 2006 for openwbem by  doxygen 1.4.6