[PPL-devel] [GIT] ppl/ppl(master): Added callback based streambufs.
Abramo Bagnara
abramo.bagnara at gmail.com
Sat Mar 21 12:22:54 CET 2009
Module: ppl/ppl
Branch: master
Commit: 8764c47130fdceb681e539b9aa58b0767cb38bd3
URL: http://www.cs.unipr.it/git/gitweb.cgi?p=ppl/ppl.git;a=commit;h=8764c47130fdceb681e539b9aa58b0767cb38bd3
Author: Abramo Bagnara <abramo.bagnara at gmail.com>
Date: Sat Mar 21 12:17:48 2009 +0100
Added callback based streambufs.
---
src/Makefile.am | 4 ++
src/c_streambuf.cc | 101 ++++++++++++++++++++++++++++++++++++
src/c_streambuf.defs.hh | 121 ++++++++++++++++++++++++++++++++++++++++++++
src/c_streambuf.inlines.hh | 35 +++++++++++++
src/c_streambuf.types.hh | 21 ++++++++
5 files changed, 282 insertions(+), 0 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
index 83a2ad6..cc3fc03 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -123,6 +123,7 @@ Checked_Number.types.hh \
$(COEFFICIENT_TYPES_INCLUDE_FILES) \
Coefficient.types.hh \
stdiobuf.types.hh \
+c_streambuf.types.hh \
globals.types.hh \
iterator_to_const.types.hh \
distances.types.hh \
@@ -194,6 +195,8 @@ Coefficient.defs.hh \
Coefficient.inlines.hh \
stdiobuf.defs.hh \
stdiobuf.inlines.hh \
+c_streambuf.defs.hh \
+c_streambuf.inlines.hh \
globals.defs.hh \
globals.inlines.hh \
math_utilities.defs.hh \
@@ -393,6 +396,7 @@ simplify.cc \
Grid_conversion.cc \
Grid_simplify.cc \
stdiobuf.cc \
+c_streambuf.cc \
globals.cc \
mp_std_bits.cc \
version.cc \
diff --git a/src/c_streambuf.cc b/src/c_streambuf.cc
new file mode 100644
index 0000000..f8a8065
--- /dev/null
+++ b/src/c_streambuf.cc
@@ -0,0 +1,101 @@
+/* c_streambuf class implementation (non-inline functions).
+ Copyright (C) 2001-2009 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <ppl-config.h>
+
+#include "c_streambuf.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+c_streambuf::int_type
+c_streambuf::uflow() {
+ int_type c = underflow();
+ nextc_buf = traits_type::eof();
+ return c;
+}
+
+c_streambuf::int_type
+c_streambuf::underflow() {
+ const int_type eof = traits_type::eof();
+ if (traits_type::eq_int_type(nextc_buf, eof)) {
+ char buf;
+ if (read(data, &buf, 1) != 1)
+ nextc_buf = eof;
+ else
+ nextc_buf = buf;
+ }
+ return nextc_buf;
+}
+
+std::streamsize
+c_streambuf::xsgetn(char_type* s, std::streamsize n) {
+ if (n == 0)
+ return n;
+ const int_type eof = traits_type::eof();
+ int a;
+ if (traits_type::eq_int_type(nextc_buf, eof))
+ a = 0;
+ else {
+ s[0] = nextc_buf;
+ a = 1;
+ }
+ std::streamsize r = read(data, s + a, n - a) + a;
+ if (r > 0)
+ ungetc_buf = traits_type::to_int_type(s[r - 1]);
+ else
+ ungetc_buf = traits_type::eof();
+ return r;
+}
+
+c_streambuf::int_type
+c_streambuf::pbackfail(int_type c) {
+ const int_type eof = traits_type::eof();
+ nextc_buf = traits_type::eq_int_type(c, eof) ? ungetc_buf : c;
+ ungetc_buf = eof;
+ return nextc_buf;
+}
+
+std::streamsize
+c_streambuf::xsputn(const char_type* s, std::streamsize n) {
+ return write(data, s, n);
+}
+
+c_streambuf::int_type
+c_streambuf::overflow(int_type c) {
+ const int_type eof = traits_type::eof();
+ if (traits_type::eq_int_type(c, eof))
+ return sync() ? eof : traits_type::not_eof(c);
+ else {
+ char buf = c;
+ if (write(data, &buf, 1) != 1)
+ return eof;
+ else
+ return c;
+ }
+}
+
+int
+c_streambuf::sync() {
+ return 0;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/c_streambuf.defs.hh b/src/c_streambuf.defs.hh
new file mode 100644
index 0000000..d58d918
--- /dev/null
+++ b/src/c_streambuf.defs.hh
@@ -0,0 +1,121 @@
+/* c_streambuf class declaration.
+ Copyright (C) 2001-2009 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_c_streambuf_defs_hh
+#define PPL_c_streambuf_defs_hh 1
+
+#include "c_streambuf.types.hh"
+#include <streambuf>
+
+typedef size_t (*read_function)(void* data, void *buf, size_t size);
+typedef size_t (*write_function)(void* data, const void *buf, size_t size);
+
+class Parma_Polyhedra_Library::c_streambuf
+ : public std::basic_streambuf<char, std::char_traits<char> > {
+public:
+ //! Constructor.
+ c_streambuf(read_function read, write_function write, void *data);
+
+protected:
+ /*! \brief
+ Gets a character in case of underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ int_type underflow();
+
+ /*! \brief
+ In case of underflow, gets a character and advances the next pointer.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ int_type uflow();
+
+ /*! \brief
+ Gets a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.3.
+ */
+ std::streamsize xsgetn(char_type* s, std::streamsize n);
+
+ /*! \brief
+ Puts character back in case of backup underflow.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.4.
+ */
+ int_type pbackfail(int_type c = traits_type::eof());
+
+ /*! \brief
+ Writes a sequence of characters.
+
+ \remarks
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ std::streamsize xsputn(const char_type* s, std::streamsize n);
+
+ /*! \brief
+ Writes a character in case of overflow.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.5.
+ */
+ int_type overflow(int_type c);
+
+ /*! \brief
+ Synchronizes the stream buffer.
+
+ Specified by ISO/IEC 14882:1998: 27.5.2.4.2.
+ */
+ int sync();
+
+private:
+ //! Character type of the streambuf.
+ typedef char char_type;
+
+ //! Traits type of the streambuf.
+ typedef std::char_traits<char_type> traits_type;
+
+ //! Integer type of the streambuf.
+ typedef traits_type::int_type int_type;
+
+ //! The read callback
+ read_function read;
+
+ //! The write callback
+ write_function write;
+
+ //! The callback data
+ void *data;
+
+ //! Buffer for the last character read.
+ int_type ungetc_buf;
+
+ //! Buffer for next character
+ int_type nextc_buf;
+};
+
+#include "c_streambuf.inlines.hh"
+
+#endif // !defined(PPL_c_streambuf_defs_hh)
diff --git a/src/c_streambuf.inlines.hh b/src/c_streambuf.inlines.hh
new file mode 100644
index 0000000..709d873
--- /dev/null
+++ b/src/c_streambuf.inlines.hh
@@ -0,0 +1,35 @@
+/* c_streambuf class implementation: inline functions.
+ Copyright (C) 2001-2009 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_c_streambuf_inlines_hh
+#define PPL_c_streambuf_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+c_streambuf::c_streambuf(read_function read, write_function write, void* data)
+ : read(read), write(write), data(data), ungetc_buf(traits_type::eof()) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_c_streambuf_inlines_hh)
diff --git a/src/c_streambuf.types.hh b/src/c_streambuf.types.hh
new file mode 100644
index 0000000..c9aea28
--- /dev/null
+++ b/src/c_streambuf.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2009 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is free software; as a special exception the author gives
+unlimited permission to copy and/or distribute it, with or without
+modifications, as long as this notice is preserved.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
+implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+PURPOSE. */
+
+#ifndef PPL_c_streambuf_types_hh
+#define PPL_c_streambuf_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class c_streambuf;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_c_streambuf_types_hh)
More information about the PPL-devel
mailing list