/************************************************************/ /* */ /* Predefined char stream: Input from (c++) stream. */ /* */ /* By Hubert Holin (Hubert.Holin@Bigfoot.com), 1998. */ /* */ /* This is completely free stuff, do whatever you want with */ /* it (but then, I will take no responsability for whatever */ /* may happen if you do either... caveat emptor!). */ /* */ /************************************************************/ #ifndef _DLG_STREAM_INPUT_H #define _DLG_STREAM_INPUT_H #include "pccts_istream.h" PCCTS_NAMESPACE_STD #ifndef DLGX_H #include "DLexerBase.h" #endif // NOTES: The semantics of the copy constructor // and the affectation operator may be unwaranted... // and the stream may not be reset. // // It would have been so much nicer for nextChar() // to throw (of for the DLGInputStream to change status) // upon hiting EOF than to return an "int"... template < class E, class T = ::std::char_traits > class DLG_stream_input : public DLGInputStream { public: DLG_stream_input(::std::basic_istream * p_input_stream) : input(p_input_stream) { // nothing to do! }; DLG_stream_input(const DLG_stream_input & a_recopier) : input(a_recopier.input) { // nothing to do! }; virtual ~DLG_stream_input() { this->purge(); // bloody templarized lookup... }; DLG_stream_input operator = (const DLG_stream_input & a_affecter) { if (this != &a_affecter) { input = a_affecter.input; } return(*this); }; virtual int nextChar() { E extracted_stuff; input->get(extracted_stuff); if (*input) { return(int(extracted_stuff)); } else { return(EOF); } }; protected: ::std::basic_istream * input; private: void purge() { // nothing to do! }; }; #endif /* _DLG_STREAM_INPUT_H */