From 8286ac511144e4f17d34eac9affb97e50646344a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Frings-F=C3=BCrst?= Date: Wed, 23 Jul 2014 15:25:44 +0200 Subject: Imported Upstream version 4.0.0 --- libcutl/cutl/compiler/code-stream.hxx | 154 ++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 libcutl/cutl/compiler/code-stream.hxx (limited to 'libcutl/cutl/compiler/code-stream.hxx') diff --git a/libcutl/cutl/compiler/code-stream.hxx b/libcutl/cutl/compiler/code-stream.hxx new file mode 100644 index 0000000..bfd33d0 --- /dev/null +++ b/libcutl/cutl/compiler/code-stream.hxx @@ -0,0 +1,154 @@ +// file : cutl/compiler/code-stream.hxx +// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#ifndef CUTL_COMPILER_CODE_STREAM_HXX +#define CUTL_COMPILER_CODE_STREAM_HXX + +#include // std::auto_ptr +#include + +#include + +namespace cutl +{ + namespace compiler + { + // + // + template + class code_stream + { + public: + code_stream () {} + + virtual + ~code_stream (); + + public: + virtual void + put (C) = 0; + + // Unbuffer flushes internal formatting buffers (if any). + // Note that unbuffer is not exactly flushing since it can + // result in formatting errors and in general can not be + // called at arbitrary points. Natural use case would be + // to call unbuffer at the end of the stream when no more + // data is expected. + // + virtual void + unbuffer () = 0; + + private: + code_stream (code_stream const&); + + code_stream& + operator= (code_stream const&); + }; + + // + // + template + class from_streambuf_adapter: public code_stream + { + public: + typedef typename std::basic_streambuf::traits_type traits_type; + typedef typename std::basic_streambuf::int_type int_type; + + class eof: exception {}; + class sync: exception {}; + + public: + from_streambuf_adapter (std::basic_streambuf& stream) + : stream_ (stream) + { + } + + private: + from_streambuf_adapter (from_streambuf_adapter const&); + + from_streambuf_adapter& + operator= (from_streambuf_adapter const&); + + public: + virtual void + put (C c); + + virtual void + unbuffer (); + + private: + std::basic_streambuf& stream_; + }; + + // + // + template + class to_streambuf_adapter: public std::basic_streambuf + { + public: + typedef typename std::basic_streambuf::traits_type traits_type; + typedef typename std::basic_streambuf::int_type int_type; + + public: + to_streambuf_adapter (code_stream& stream) + : stream_ (stream) + { + } + + private: + to_streambuf_adapter (to_streambuf_adapter const&); + + to_streambuf_adapter& + operator= (to_streambuf_adapter const&); + + public: + virtual int_type + overflow (int_type i); + + // Does nothing since calling unbuffer here would be dangerous. + // See the note in code_stream. + // + virtual int + sync (); + + private: + code_stream& stream_; + }; + + // + // + template