diff orange/serialization/Serializable.d @ 0:f7b078e85f7f

First commit
author Jacob Carlborg <doob@me.com>
date Wed, 26 May 2010 17:19:13 +0200
parents
children 511d1ef4e299
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/orange/serialization/Serializable.d	Wed May 26 17:19:13 2010 +0200
@@ -0,0 +1,58 @@
+/**
+ * Copyright: Copyright (c) 2010 Jacob Carlborg.
+ * Authors: Jacob Carlborg
+ * Version: Initial created: Jan 26, 2010
+ * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
+ */
+module orange.serialization.Serializable;
+
+import orange.serialization.archives.Archive;
+import orange.serialization.Events;
+import orange.util.CTFE;
+
+template Serializable ()
+{
+	void toData (T) (T archive, T.DataType key)
+	{		
+		alias typeof(this) ThisType;
+		
+		foreach (i, dummy ; typeof(T.tupleof))
+		{
+			alias typeof(ThisType.tupleof[i]) FieldType;
+			
+			const field = nameOfFieldAt!(ThisType, i);			
+			auto value = getValueOfField!(ThisType, FieldType, field)(this);
+			
+			archive.archive(value, field);
+		}
+	}
+	
+	void fromData (T) (T archive, T.DataType key)
+	{
+		alias typeof(this) ThisType;
+		
+		foreach (i, dummy ; typeof(ThisType.tupleof))
+		{
+			alias typeof(ThisType.tupleof[i]) FieldType;
+			
+			const field = nameOfFieldAt!(ThisType, i);
+			auto value = archive.unarchive!(FieldType)(field);
+			
+			setValueOfField!(FieldType, ThisType, field)(this, value);
+		}
+	}
+}
+
+template NonSerialized (alias field)
+{
+	NonSerializedField!(field) __nonSerialized;
+}
+
+struct NonSerializedField (alias f)
+{
+	const field = f.stringof;
+}
+
+package const nonSerializedField = "__nonSerialized";
+package const serializedField = "__serialized";
+package const internalFields = [nonSerializedField[], onDeserializedField, onDeserializingField, onSerializedField, onSerializingField];
\ No newline at end of file