struct TypeWriter: public VariantTypeWriter<_Type, std::is_base_of<CommonAPI::SerializableVariant, _Type>::value>{};
-struct TypeSearchVisitor {
-public:
- TypeSearchVisitor(TypeOutputStream& typeStream): typeStream_(typeStream) {
- }
-
- template<typename _Type>
- void operator()(const _Type& currentType) const {
- TypeWriter<_Type>::writeType(typeStream_);
- }
-
-private:
- TypeOutputStream& typeStream_;
-};
-
-
class OutputStream {
public:
virtual void beginWriteMap(size_t elementCount) = 0;
virtual void endWriteMap() = 0;
-
- virtual std::shared_ptr<TypeOutputStream> getNewTypeOutputStream() = 0;
};
}
inline OutputStream& operator<<(OutputStream& outputStream, const SerializableVariant& serializableVariant) {
- std::shared_ptr<TypeOutputStream> typeOutStream = outputStream.getNewTypeOutputStream();
-
-// CommonAPI::TypeSearchVisitor searchVisitor(typeStream_);
-// CommonAPI::ApplyVoidVisitor<CommonAPI::TypeSearchVisitor, CommonAPI::Variant<uint32_t, double, TestStruct>, uint32_t, double, TestStruct>::visit(searchVisitor, myVariant);
-
outputStream.beginWriteSerializableVariant(serializableVariant);
serializableVariant.writeToOutputStream(outputStream);
outputStream.endWriteSerializableVariant(serializableVariant);
class TypeOutputStream;
+template<typename _Type>
+struct TypeWriter;
+
class SerializableVariant {
public:
virtual ~SerializableVariant() {
virtual void readFromInputStream(InputStream& inputStream) = 0;
virtual void writeToOutputStream(OutputStream& outputStream) const = 0;
+
+ virtual void writeToTypeOutputStream(TypeOutputStream& typeOutputStream) const = 0;
};
template<typename ... _Types>
//won't be called
assert(false);
}
+
+ static
+ void visit(Visitor&, const Variant&) {
+ //won't be called
+ assert(false);
+ }
};
template<class Visitor, class Variant, typename _Type, typename ... _Types>
ApplyVoidVisitor<Visitor, Variant, _Types...>::visit(visitor, var);
}
}
+
+ static
+ void visit(Visitor& visitor, const Variant& var) {
+ if (var.getValueType() == index) {
+ bool b;
+ visitor(var.template get<_Type>(b));
+ } else {
+ ApplyVoidVisitor<Visitor, Variant, _Types...>::visit(visitor, var);
+ }
+ }
};
template<class Visitor, class Variant, typename ... _Types>
typename std::aligned_storage<size>::type& storage_;
};
+struct TypeWriteVisitor {
+public:
+ TypeWriteVisitor(TypeOutputStream& typeStream): typeStream_(typeStream) {
+ }
+
+ template<typename _Type>
+ void operator()(const _Type&) const {
+ TypeWriter<_Type>::writeType(typeStream_);
+ }
+
+private:
+ TypeOutputStream& typeStream_;
+};
+
template<typename _U, typename ... _Types>
struct TypeSelector;
//TODO
}
- static void writeToTypeOutputStream(TypeOutputStream& typeOutputStream) {
- //TODO
+ virtual void writeToTypeOutputStream(TypeOutputStream& typeOutputStream) const {
+ TypeWriteVisitor visitor(typeOutputStream);
+ ApplyVoidVisitor<TypeWriteVisitor, Variant<_Types...>, _Types...>::visit(visitor, *this);
}
Variant& operator=(const Variant& rhs)