FBB::IFilterBuf(3bobcat) | Filtering Input Stream Buffer | FBB::IFilterBuf(3bobcat) |
FBB::IFilterBuf - Filtering stream buffer initialized by a std::istream object
#include <bobcat/ifilterbuf>
Linking option: -lbobcat
FBB::IFilterBuf objects may be used as a std::streambuf for std::istream objects, filtering the information produced by those objects.
The class IFilterBuf was designed with the openSSL BIO (cf. bio(3ssl)) in mind. Since the BIO concept was developed in the context of the C programming language, BIOs do not support C++ streams. Nonetheless, the concept of a filtering device is an attractive one, and is offered by the FBB::IFilterBuf class.
In addition to filtering, IFilterBuf offers flexible internal buffer management: derived classes can push back characters until the beginning of the internal buffer has been reached, but may then continue pushing back characters until the internal buffer has reached its maximum size. This maximum size is defined by the constructor’s maxSize parameter (see below).
The class IFilterBuf is an abstract base class. It is used via classes that are derived from IFilterBuf, implementing its pure virtual load member (see below at PRIVATE VIRTUAL MEMBER FUNCTIONS).
FBB
All constructors, members, operators and manipulators, mentioned in this
man-page, are defined in the namespace FBB.
std::streambuf
All members of std::streambuf are available, as IFilterBuf inherits from this class.
Copy and move constructors (and assignment operators) are not available.
Here is a class, derived from IFilterBuf, filtering out a predefined set of characters. It is used twice to filter digits and vowels, illustrating chaining of IFilterBuf objects.
#include <iostream> #include <istream> #include <string> #include <bobcat/ifilterbuf> class CharFilterStreambuf: public FBB::IFilterBuf {
std::istream &d_in; // stream to read from
std::string d_rmChars; // chars to rm
std::string d_buffer; // locally buffered chars
size_t const d_maxSize = 100;
public:
CharFilterStreambuf(std::istream &in, std::string const &rmChars);
private:
bool filter(char const **srcBegin,
char const **srcEnd) override; }; CharFilterStreambuf::CharFilterStreambuf(std::istream &in,
std::string const &rmChars) :
d_in(in),
d_rmChars(rmChars) {
setBuffer(); // required if peek() must return the 1st } // available character right from the start bool CharFilterStreambuf::filter(char const **srcBegin,
char const **srcEnd) {
d_buffer.clear();
while (d_buffer.size() != d_maxSize)
{
char ch;
if (not d_in.get(ch))
break;
if (d_rmChars.find(ch) != std::string::npos) // found char to rm
continue;
d_buffer.push_back(ch);
}
if (d_buffer.empty())
return false;
*srcBegin = d_buffer.data();
*srcEnd = d_buffer.data() + d_buffer.size();
return true; } int main() {
CharFilterStreambuf buf1(std::cin, "1234567890");
std::istream in1(&buf1);
CharFilterStreambuf buf2(in1, "AEIOUaeiou");
std::istream in2(&buf2);
std::cout << in2.rdbuf(); }
bobcat/ifdbuf - defines the class interface
bobcat(7), isymcryptstreambuf(3bobcat), ibase64buf(3bobcat), ofilterbuf(3bobcat). std::streambuf
None reported.
Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.
This is free software, distributed under the terms of the GNU General Public License (GPL).
Frank B. Brokken (f.b.brokken@rug.nl).
2005-2020 | libbobcat-dev_5.07.00 |