blob: 8ccfed948f579c89d50d1268230ff837f1724c2f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/* $Rev$ $Date$ */
#ifndef tuscany_stream_hpp
#define tuscany_stream_hpp
/**
* Basic stream type and functions.
*/
#include <stdarg.h>
#include "config.hpp"
#include "gc.hpp"
#include "string.hpp"
namespace tuscany {
/**
* Base output stream.
*/
class ostream {
public:
virtual ostream& vprintf(const char* fmt, ...) = 0;
virtual ostream& write(const string& s) = 0;
virtual ostream& flush() = 0;
};
/**
* Flush a stream.
*/
ostream& flush(ostream& os) {
return os.flush();
}
/**
* Write simple values to a stream.
*/
ostream& operator<<(ostream& os, const char* v) {
return os.vprintf("%s", v);
}
ostream& operator<<(ostream& os, const unsigned char* v) {
return os.vprintf("%s", v);
}
ostream& operator<<(ostream& os, const char v) {
return os.vprintf("%c", v);
}
ostream& operator<<(ostream& os, const int v) {
return os.vprintf("%d", v);
}
ostream& operator<<(ostream& os, const unsigned int v) {
return os.vprintf("%u", v);
}
ostream& operator<<(ostream& os, const long int v) {
return os.vprintf("%ld", v);
}
ostream& operator<<(ostream& os, const long unsigned int v) {
return os.vprintf("%lu", v);
}
ostream& operator<<(ostream& os, const double v) {
return os.vprintf("%.10g", v);
}
ostream& operator<<(ostream& os, const void* v) {
return os.vprintf("%p", v);
}
ostream& operator<<(ostream& os, const string& v) {
return os.write(v);
}
class stream_endl {
} endl;
ostream& operator<<(ostream& os, unused const stream_endl e) {
os.write("\n");
return os.flush();
}
/*
* Input stream.
*/
class istream {
public:
virtual const size_t read(void* buf, size_t size) = 0;
virtual const bool eof() = 0;
virtual const bool fail() = 0;
virtual const int get() = 0;
virtual const int peek() = 0;
};
/**
* Read from an input stream.
*/
const size_t read(istream& is, void * buf, size_t size) {
return is.read(buf, size);
}
/**
* Return true if the end of an input stream has been reached.
*/
const bool eof(istream& is) {
return is.eof();
}
/**
* Return true if an input stream can't be accessed.
*/
const bool fail(istream& is) {
return is.fail();
}
/**
* Read a character from a stream.
*/
const int get(istream& is) {
return is.get();
}
/**
* Peek a character from a stream.
*/
const int peek(istream& is) {
return is.peek();
}
template<typename T> ostream& operator<<(ostream& out, const gc_ptr<T>& p) {
return out << p.ptr;
}
#ifdef WANT_MAINTAINER_LOG
/**
* Debug stream implementation with no dependencies on anything else.
*/
class odebugstream : public ostream {
public:
odebugstream() {
}
odebugstream& vprintf(const char* fmt, ...) {
va_list args;
string s;
va_start (args, fmt);
s.len = vsnprintf(NULL, 0, fmt, args);
s.buf = gc_cnew(s.len + 1);
va_start (args, fmt);
vsnprintf(s.buf, s.len + 1, fmt, args);
buf = buf + s;
va_end (args);
return *this;
}
odebugstream& write(const string& s) {
buf = buf + s;
return *this;
}
odebugstream& flush() {
return *this;
}
private:
friend const string str(odebugstream& os);
string buf;
};
const string str(odebugstream& os) {
return os.buf;
}
#endif
}
#endif /* tuscany_stream_hpp */