Commit 4853a559 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Your Templates are Bad and You Should Feel Bad

parent b682dc0c
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -7,10 +7,13 @@ class XDRStream {
 private:
	XDRStream(const XDRStream& copy);
	uint32_t next_array_len;
	bool is_fixed_length;

 public:
	XDRStream() : next_array_len(0) {}
	void setNextArrayLen(uint32_t len) {next_array_len = len;}
	void setFixedLength() { is_fixed_length = true; }
	void setVariableLength() { is_fixed_length = false; }

	virtual void put(char c) = 0;

@@ -26,7 +29,8 @@ class XDRStream {
	XDRStream & operator<<(long number);
	XDRStream & operator<<(unsigned long long number);
	XDRStream & operator<<(long long number);
	XDRStream & operator<<(const char *text);
	XDRStream & operator<<(char const *text);
	template<int N> XDRStream & operator<<(char const (&text)[N]);
	XDRStream & operator<<(XDRStream & (*fun) (XDRStream &));
};

@@ -37,6 +41,10 @@ XDRStream & flush(XDRStream & os);
// TERM: zero-termination
XDRStream & term(XDRStream & os);

template<int N>
XDRStream & opaque(XDRStream & os);

XDRStream & fixed(XDRStream & os);
XDRStream & variable(XDRStream & os);

#endif //OUTPUTSTREAM_H
+8 −2
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
#include "object/stdbuf.h"
#include "object/xdrstream.h"

char buf[128];
char buf[256];

void loop(void)
{
@@ -30,10 +30,16 @@ void loop(void)

	BufferOutput<XDRStream> foostream(buf);

	char test[] = "Obai World!";

	foostream << 123 << 0 << 12345678;
	foostream.setNextArrayLen(3);
	foostream << fixed << "Hai";
	foostream.setNextArrayLen(sizeof(test));
	foostream << variable << (char const *)test;

	kout << "foostream is " << hex;
	for (unsigned int i = 0; i < 32; i += 4) {
	for (unsigned int i = 0; i < 64; i += 4) {
		kout << (unsigned char)buf[i] << (unsigned char)buf[i+1];
		kout << (unsigned char)buf[i+2] << (unsigned char)buf[i+3] << " ";
	}
+32 −1
Original line number Diff line number Diff line
@@ -69,6 +69,9 @@ XDRStream & XDRStream::operator<<(int64_t number)
}

XDRStream & XDRStream::operator<<(char const *data){
	if (!is_fixed_length) {
		*this << next_array_len;
	}
	uint32_t i;
	for (i = 0; i < next_array_len; i++) {
		put(data[i]);
@@ -79,6 +82,21 @@ XDRStream & XDRStream::operator<<(char const *data){
	return *this;
}

template<int N>
XDRStream & XDRStream::operator<<(char const (&data)[N]){
	if (!is_fixed_length) {
		*this << N;
	}
	uint32_t i;
	for (i = 0; i < N; i++) {
		put(data[i]);
	}
	while ((i++) % 4 != 0){
		put('\0');
	}
	return *this;
}

XDRStream & XDRStream::operator<<(XDRStream & (*fkt) (XDRStream &))
{
	return fkt(*this);
@@ -99,8 +117,21 @@ XDRStream & term(XDRStream & os)
	return os;
}

template<int N>
XDRStream & opaque(XDRStream & os)
{
	os.setNextArrayLen(3);
	os.setNextArrayLen(N);
	return os;
}

XDRStream & fixed(XDRStream & os)
{
	os.setFixedLength();
	return os;
}

XDRStream & variable(XDRStream & os)
{
	os.setVariableLength();
	return os;
}