blocxx
IstreamBufIterator.hpp
Go to the documentation of this file.
1/*******************************************************************************
2* Copyright (C) 2005, Vintela, Inc. All rights reserved.
3* Copyright (C) 2006, Novell, Inc. All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met:
7*
8* * Redistributions of source code must retain the above copyright notice,
9* this list of conditions and the following disclaimer.
10* * Redistributions in binary form must reproduce the above copyright
11* notice, this list of conditions and the following disclaimer in the
12* documentation and/or other materials provided with the distribution.
13* * Neither the name of
14* Vintela, Inc.,
15* nor Novell, Inc.,
16* nor the names of its contributors or employees may be used to
17* endorse or promote products derived from this software without
18* specific prior written permission.
19*
20* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30* POSSIBILITY OF SUCH DAMAGE.
31*******************************************************************************/
32
33
38#ifndef BLOCXX_ISTREAMBUFITERATOR_HPP_INCLUDE_GUARD_
39#define BLOCXX_ISTREAMBUFITERATOR_HPP_INCLUDE_GUARD_
40#include "blocxx/BLOCXX_config.h"
41#if defined(BLOCXX_HAVE_ISTREAM)
42#include <istream>
43#else
44#include <iostream>
45#endif
46
47
48namespace BLOCXX_NAMESPACE
49{
50
57{
58public:
59 class proxy
60 {
61 friend class IstreamBufIterator;
62 public:
63 char operator*() { return m_keep; }
64 private:
65 proxy(char c) : m_keep(c) {}
66 char m_keep;
67 };
69 IstreamBufIterator(std::istream& s) : m_sbuf(s.rdbuf()->sgetc() == EOF ? 0 : s.rdbuf()) {}
70 IstreamBufIterator(std::streambuf* b) : m_sbuf(b->sgetc() == EOF ? 0 : b) {}
71 char operator*() const
72 {
73 if (m_sbuf)
74 {
75 return (m_sbuf->sgetc());
76 }
77 else
78 {
79 return 0;
80 }
81 }
83 {
84 m_sbuf->sbumpc();
85 if (m_sbuf->sgetc() == EOF)
86 {
87 m_sbuf = 0;
88 }
89 return *this;
90 }
92 {
93 proxy temp(m_sbuf->sgetc());
94 m_sbuf->sbumpc();
95 if (m_sbuf->sgetc() == EOF)
96 {
97 m_sbuf = 0;
98 }
99 return temp;
100 }
101
102 bool equal(const IstreamBufIterator& b) const
103 {
104 return (m_sbuf == 0) ^ (b.m_sbuf != 0); // do a little manual strength reduction
105// if (((m_sbuf == 0) && (b.m_sbuf == 0)) || ((m_sbuf != 0) && (b.m_sbuf != 0)))
106// {
107// return true;
108// }
109// else
110// {
111// return false;
112// }
113 }
114private:
115 std::streambuf* m_sbuf;
116};
117inline bool operator==(const IstreamBufIterator& lhs, const IstreamBufIterator& rhs)
118{
119 return lhs.equal(rhs);
120}
121inline bool operator!=(const IstreamBufIterator& lhs, const IstreamBufIterator& rhs)
122{
123 return !lhs.equal(rhs);
124}
125
126} // end namespace BLOCXX_NAMESPACE
127
128#endif
This class differs from a std::istreambuf_iterator in that dereferncing an eof iterator returns 0 Thi...
bool equal(const IstreamBufIterator &b) const
Taken from RFC 1321.
bool operator==(const Array< T > &x, const Array< T > &y)
bool operator!=(const Array< T > &x, const Array< T > &y)
Determine two Arrays are not equal.
Definition Array.hpp:446