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