diff --git a/include/Makefile.am b/include/Makefile.am
index 54d71c1..90681df 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -4,6 +4,7 @@ nobase_include_HEADERS = trbase.h \
tr/interface.h \
tr/memory.h \
tr/logger.h \
+ tr/sized_data.h \
tr/tree_macros.h \
tr/interface/class.h \
tr/interface/indexable.h \
diff --git a/include/tr/class.h b/include/tr/class.h
index f656da9..67912f1 100644
--- a/include/tr/class.h
+++ b/include/tr/class.h
@@ -75,6 +75,16 @@
#define TR_CLASSVARS_DECL(name) struct c_##name##_vars
#define TR_CLASSVARS(name, class) ((struct c_##name##_vars *)(class)->vars)
+#define TR_CLASSVARS_BY_NAME(name) \
+ ((struct c_##name##_vars *)(TR_CLASS_BY_NAME(name))->vars)
+#define TR_CLASSVARS_STATIC(name) \
+ ((struct c_##name##_vars *)(TR_CLASS_BY_NAME_STATIC(name))->vars)
+
+#define TR_INHERIT_CLASSVARS(dest, src) \
+ memcpy(&c_##dest##_vars, \
+ TR_CLASSVARS_BY_NAME(src), \
+ sizeof(TR_CLASSVAR_DECL(src)))
+
/**
* Make the new class a child of an existing class.
diff --git a/include/tr/sized_data.h b/include/tr/sized_data.h
new file mode 100644
index 0000000..e0ee0ba
--- /dev/null
+++ b/include/tr/sized_data.h
@@ -0,0 +1,42 @@
+/**
+ * \file
+ * Combines a char * with size_t to get a generic data structure.
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program 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.
+ *
+ * This program 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, see .
+ */
+
+#ifndef __TR_SIZED_DATA_H__
+#define __TR_SIZED_DATA_H__
+
+#include
+
+#include "trbase.h"
+
+TR_CLASS(TR_SizedData) {
+ char * data;
+ size_t size;
+};
+TR_INSTANCE_INIT(TR_SizedData);
+TR_CLASSVARS_DECL(TR_SizedData) {};
+
+void TR_sizedDataSetData(TR_SizedData, const char *, size_t);
+
+#endif // __TR_SIZED_DATA_H__
+
+// vim: set ts=4 sw=4:
diff --git a/include/trbase.h b/include/trbase.h
index 2eb0fee..42d41d0 100644
--- a/include/trbase.h
+++ b/include/trbase.h
@@ -5,6 +5,7 @@
#include "tr/memory.h"
#include "tr/class.h"
#include "tr/logger.h"
+#include "tr/sized_data.h"
#include "tr/interface.h"
#include "tr/interface/class.h"
#include "tr/interface/subject.h"
diff --git a/src/Makefile.am b/src/Makefile.am
index 2cf64ac..5b06a78 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,6 +8,8 @@ TR_CLASS = memory.c \
logger.c \
stderr.c \
syslog.c \
+ sized_data.c \
+ sized_data_set_data.c \
i_class.c \
i_subject.c \
i_observer.c \
diff --git a/src/sized_data.c b/src/sized_data.c
new file mode 100644
index 0000000..7100969
--- /dev/null
+++ b/src/sized_data.c
@@ -0,0 +1,58 @@
+/**
+ * \file
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program 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.
+ *
+ * This program 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, see .
+ */
+
+#include
+#include
+#include
+
+#include "trbase.h"
+
+#include "tr/sized_data.h"
+
+static
+int
+sizedDataCtor(void * _this, va_list * params)
+{
+ TR_SizedData this = _this;
+ char * data = va_arg(*params, char *);
+
+ this->size = va_arg(*params, size_t);
+
+ if (data != NULL) {
+ this->data = TR_malloc(this->size);
+ memcpy(this->data, data, this->size);
+ }
+
+ return 0;
+}
+
+static
+void
+sizedDataDtor(void * _this)
+{
+ TR_MEM_FREE(((TR_SizedData)_this)->data);
+}
+
+TR_INIT_IFACE(TR_Class, sizedDataCtor, sizedDataDtor, NULL);
+TR_CREATE_CLASS(TR_SizedData, NULL, NULL, TR_IF(TR_Class));
+
+// vim: set ts=4 sw=4:
diff --git a/src/sized_data_set_data.c b/src/sized_data_set_data.c
new file mode 100644
index 0000000..e628651
--- /dev/null
+++ b/src/sized_data_set_data.c
@@ -0,0 +1,45 @@
+/**
+ * \file
+ *
+ * \author Georg Hopp
+ *
+ * \copyright
+ * Copyright © 2014 Georg Hopp
+ *
+ * This program 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.
+ *
+ * This program 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, see .
+ */
+
+#include // for atoi() and exit()
+#include // for errno
+#include
+#include
+
+#include "tr/sized_data.h"
+
+void
+TR_sizedDataSetData(TR_SizedData this, const char * data, size_t size)
+{
+ if (this->data && TR_getSize(this->data) < size) {
+ TR_MEM_FREE(this->data);
+ }
+
+ if (! this->data) {
+ this->data = TR_malloc(size);
+ }
+
+ this->size = size;
+ memcpy(this->data, data, size);
+}
+
+// vim: set ts=4 sw=4: