Provided by: libbobcat-dev_3.19.01-1ubuntu1_amd64 bug

NAME

       FBB::IFilterStreambuf - Filtering stream buffer initialized by a std::istream object

SYNOPSIS

       #include <bobcat/ifilterstreambuf>
       Linking option: -lbobcat

DESCRIPTION

       FBB::IFilterStreambuf  objects  may  be  used as a std::streambuf for std::istream objects, filtering the
       information produced by those objects.

       The class IFilterStreambuf 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::IFilterStreambuf class.

       In  addition  to  filtering,  IFilterStreambuf  objects  use  split  buffers,  and thus, depending on the
       (configurable) size of buffer that is maintained by IFilterStreambuf objects, usually multiple characters
       read from the IFilterStreambuf can be pushed back again.

       The class IFilterStreambuf is an abstract base class. It is  used  via  classes  that  are  derived  from
       IFilterStreambuf,  implementing  its  pure  virtual  load  member  (see  below  at PRIVATE VIRTUAL MEMBER
       FUNCTIONS).

NAMESPACE

       FBB
       All constructors, members, operators and manipulators, mentioned in this man-page,  are  defined  in  the
       namespace FBB.

INHERITS FROM

       std::streambuf

MEMBER FUNCTIONS

       All  members  of  std::streambuf are available, as IFilterStreambuf inherits from this class. Some of the
       std::streambuf’s member are overridden by IFilterStreambuf, see the next section.

       Overloaded move and/or copy assignment operators are not available.

PROTECTED CONSTRUCTOR

       o      IFilterStreambuf(size_t bufSize = 1000):
              This constructor initializes the streambuf, using a  buffer  of  the  indicated  size.  While  the
              streambuf  is  being  used, its buffer is gradually filled. Eventually, when it is full the oldest
              characters are removed from the buffer, making room for more recent characters. At most  half  the
              bufSize  number of characters will be removed during a single refill. The constructor ensures that
              the size of the buffer will always  be  at  least  100.   Copy-  and  move  constructors  are  not
              available.

PROTECTED MEMBER FUNCTION

       o      void setBuffer():
              This  member  initializes the base class’s buffer pointers (i.e., eback, gptr, and egptr) with the
              initial range of characters retrieved by filter (see below).

              The member setBuffer should only once be called from the derived class’s constructor. Once it  has
              been  called,  the  peek  member of the std::istream that is initialized with the IFilterStreambuf
              will return the next available character, even if no  other  stream  operation  has  as  yet  been
              performed.  If  it  is not called by the derived class’s constructor, then peek returns 0 until at
              least one character has been retrieved from the istream object.

PRIVATE VIRTUAL MEMBER FUNCTIONS

       o      virtual bool filter(char const **srcBegin, char const **srcEnd) = 0:
              The filter member is declared as a pure virtual member: derived classes must override filter  with
              their own implementation.

              Derived  class  objects  are responsible for obtaining information (in any amount) from the device
              with which they interact. This information is then passed  on  to  the  IFilterStreambuf  via  two
              pointers,  pointing,  respectively, to the first available character and beyond the last available
              character.  The  characters  indicated  by  this  range  are  subsequently  transferred   by   the
              IFilterStreambuf  object  to  its own buffer, from where they are then retrieved (or to where they
              can be pushed back) by the application.

              The filter member allows implementations to filter and/or modify the information that is  obtained
              by  this member. The EXAMPLE section below provides an example filtering out a configurable set of
              characters  from  a  provided  std::istream.  Bobcat’s  classes  ISymCryptStreambuf(3bobcat)   and
              IBase64Streambuf(3bobcat) provide additional examples of classes derived from  IFilterStreambuf.

              The filter member should return false if no (more) information is available. It should return true
              if  information  is  available,  in  which  case  *srcBegin  and  *srcEnd  should  be pointing to,
              respectively, the first character and beyond the last character made available by filter;

       o      int pbackfail() final override:
              The pbackfail member is final; derived classes cannot override it.  Currently  it  merely  returns
              EOF. This may change in future implementations.

       o      std::streamsize showmanyc() final override:
              The  showmanyc  member is final; derived classes cannot override it. It returns the current number
              of characters that are (still) waiting to be processed in the range of characters returned by  the
              latest filter call.

       o      int underflow() final override:
              The  underflow member is final; derived classes cannot override it. It calls filter, and refreshes
              at most half the size of its internal buffer with characters from the range of characters that was
              returned by the most recent call of filter.  The final attribute was  added  to  the  above  three
              members to give IFilterStreambuf objects full control over their own buffers.

EXAMPLE

       Here  is a class, derived from IFilterStreambuf, filtering out a predefined set of characters. It is used
       twice to filter digits and vowels, to illustrate chaining of IFilterStreambuf objects.

       #include <iostream>
       #include <istream>
       #include <string>

       #include <bobcat/ifilterstreambuf>

       class CharFilterStreambuf: public FBB::IFilterStreambuf
       {
           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();
       }

FILES

       bobcat/ifdstreambuf - defines the class interface

SEE ALSO

       bobcat(7),     isymcryptstreambuf(3bobcat),     ibase64streambuf(3bobcat),     ofilterstreambuf(3bobcat).
       std::streambuf

BUGS

       None reported.

DISTRIBUTION FILES

       o      bobcat_3.19.01-x.dsc: detached signature;

       o      bobcat_3.19.01-x.tar.gz: source archive;

       o      bobcat_3.19.01-x_i386.changes: change log;

       o      libbobcat1_3.19.01-x_*.deb: debian package holding the libraries;

       o      libbobcat1-dev_3.19.01-x_*.deb: debian package holding the libraries, headers and manual pages;

       o      http://sourceforge.net/projects/bobcat: public archive location;

BOBCAT

       Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.

COPYRIGHT

       This is free software, distributed under the terms of the GNU General Public License (GPL).

AUTHOR

       Frank B. Brokken (f.b.brokken@rug.nl).

libbobcat-dev_3.19.01-x.tar.gz                      2005-2013                     FBB::IFilterStreambuf(3bobcat)