You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2009/06/25 21:12:46 UTC
svn commit: r788469 - in /hadoop/avro/trunk: ./ src/c++/ src/c++/api/
src/c++/impl/ src/c++/test/
Author: cutting
Date: Thu Jun 25 19:12:45 2009
New Revision: 788469
URL: http://svn.apache.org/viewvc?rev=788469&view=rev
Log:
AVRO-59. C++: make serializer more generic. Contributed by Scott Banachowski.
Added:
hadoop/avro/trunk/src/c++/api/ValidatingWriter.hh
hadoop/avro/trunk/src/c++/api/Writer.hh
hadoop/avro/trunk/src/c++/impl/ValidatingWriter.cc
Modified:
hadoop/avro/trunk/CHANGES.txt
hadoop/avro/trunk/src/c++/Makefile
hadoop/avro/trunk/src/c++/api/AvroParse.hh
hadoop/avro/trunk/src/c++/api/AvroSerialize.hh
hadoop/avro/trunk/src/c++/api/AvroTraits.hh
hadoop/avro/trunk/src/c++/api/AvroTypes.hh
hadoop/avro/trunk/src/c++/api/Serializer.hh
hadoop/avro/trunk/src/c++/api/Types.hh
hadoop/avro/trunk/src/c++/api/ValidatingSerializer.hh
hadoop/avro/trunk/src/c++/impl/ValidatingSerializer.cc
hadoop/avro/trunk/src/c++/test/testgen.cc
hadoop/avro/trunk/src/c++/test/unittest.cc
Modified: hadoop/avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/CHANGES.txt?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/CHANGES.txt (original)
+++ hadoop/avro/trunk/CHANGES.txt Thu Jun 25 19:12:45 2009
@@ -79,6 +79,9 @@
AVRO-36. Correctly encode and decode binary default values.
(cutting)
+ AVRO-59. C++: make serializer more generic. (Scott Banachowski
+ via cutting)
+
OPTIMIZATIONS
BUG FIXES
Modified: hadoop/avro/trunk/src/c++/Makefile
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/Makefile?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/Makefile (original)
+++ hadoop/avro/trunk/src/c++/Makefile Thu Jun 25 19:12:45 2009
@@ -55,9 +55,6 @@
$(OBJDIR)/lex.yy.o : parser/lex.yy.cc
$(CXX) $(CXXFLAGS) -Wno-unused $(INCFLAGS) -c -o $@ $<
-#$(OBJDIR)/parserlib.a : $(OBJDIR)/avro.tab.o $(OBJDIR)/lex.yy.o
- #ar ruc $@ $^
-
testparser: test/testparser.cc $(OBJDIR)/avrolib.a
$(CXX) $(CXXFLAGS) $(INCFLAGS) -o $@ $^ $(LIBS)
Modified: hadoop/avro/trunk/src/c++/api/AvroParse.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/AvroParse.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/AvroParse.hh (original)
+++ hadoop/avro/trunk/src/c++/api/AvroParse.hh Thu Jun 25 19:12:45 2009
@@ -2,7 +2,7 @@
#define avro_AvroParse_hh__
#include <boost/static_assert.hpp>
-#include "AvroTypes.hh"
+#include "AvroTraits.hh"
/// \file
///
Modified: hadoop/avro/trunk/src/c++/api/AvroSerialize.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/AvroSerialize.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/AvroSerialize.hh (original)
+++ hadoop/avro/trunk/src/c++/api/AvroSerialize.hh Thu Jun 25 19:12:45 2009
@@ -2,7 +2,7 @@
#define avro_AvroSerialize_hh__
#include <boost/static_assert.hpp>
-#include "AvroTypes.hh"
+#include "AvroTraits.hh"
/// \file
///
@@ -13,16 +13,16 @@
/// The main serializer entry point function. Takes a serializer (either validating or
/// plain) and the object that should be serialized.
-template <typename Serializer, typename T>
-void serialize(Serializer &s, const T& val)
+template <typename Writer, typename T>
+void serialize(Writer &s, const T& val)
{
serialize(s, val, is_serializable<T>());
}
/// Type trait should be set to is_serializable in otherwise force the compiler to complain.
-template <typename Serializer, typename T>
-void serialize(Serializer &s, const T& val, const boost::false_type &)
+template <typename Writer, typename T>
+void serialize(Writer &s, const T& val, const boost::false_type &)
{
BOOST_STATIC_ASSERT(sizeof(T)==0);
}
@@ -31,43 +31,13 @@
// @{
-template <typename Serializer>
-void serialize(Serializer &s, int32_t val, const boost::true_type &) {
- s.putInt(val);
+template <typename Writer, typename T>
+void serialize(Writer &s, T val, const boost::true_type &) {
+ s.putValue(val);
}
-template <typename Serializer>
-void serialize(Serializer &s, int64_t val, const boost::true_type &) {
- s.putLong(val);
-}
-
-template <typename Serializer>
-void serialize(Serializer &s, float val, const boost::true_type &) {
- s.putFloat(val);
-}
-
-template <typename Serializer>
-void serialize(Serializer &s, double val, const boost::true_type &) {
- s.putDouble(val);
-}
-
-template <typename Serializer>
-void serialize(Serializer &s, const Null &, const boost::true_type &) {
- s.putNull();
-}
-
-template <typename Serializer>
-void serialize(Serializer &s, bool val, const boost::true_type &) {
- s.putBool(val);
-}
-
-template <typename Serializer>
-void serialize(Serializer &s, const std::string &val, const boost::true_type &) {
- s.putString(val);
-}
-
-template <typename Serializer>
-void serialize(Serializer &s, const std::vector<uint8_t> &val, const boost::true_type &) {
+template <typename Writer>
+void serialize(Writer &s, const std::vector<uint8_t> &val, const boost::true_type &) {
s.putBytes(&val[0], val.size());
}
Modified: hadoop/avro/trunk/src/c++/api/AvroTraits.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/AvroTraits.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/AvroTraits.hh (original)
+++ hadoop/avro/trunk/src/c++/api/AvroTraits.hh Thu Jun 25 19:12:45 2009
@@ -3,6 +3,8 @@
#include <boost/type_traits.hpp>
+#include "Types.hh"
+
/// \file
///
/// Define an is_serializable trait for types we can serialize natively.
@@ -13,26 +15,29 @@
template <typename T>
struct is_serializable : public boost::false_type{};
-template <>
-struct is_serializable<int32_t> : public boost::true_type{};
-
-template <>
-struct is_serializable<int64_t> : public boost::true_type{};
-
-template <>
-struct is_serializable<float> : public boost::true_type{};
-
-template <>
-struct is_serializable<double> : public boost::true_type{};
-
-template <>
-struct is_serializable<bool> : public boost::true_type{};
-
-template <>
-struct is_serializable<std::string> : public boost::true_type{};
+template <typename T>
+struct type_to_avro {
+ static const Type type = AVRO_NUM_TYPES;
+};
+
+#define DEFINE_PRIMITIVE(CTYPE, AVROTYPE) \
+template <> \
+struct is_serializable<CTYPE> : public boost::true_type{}; \
+\
+template <> \
+struct type_to_avro<CTYPE> { \
+ static const Type type = AVROTYPE; \
+};
+
+DEFINE_PRIMITIVE(int32_t, AVRO_INT)
+DEFINE_PRIMITIVE(int64_t, AVRO_LONG)
+DEFINE_PRIMITIVE(float, AVRO_FLOAT)
+DEFINE_PRIMITIVE(double, AVRO_DOUBLE)
+DEFINE_PRIMITIVE(bool, AVRO_BOOL)
+DEFINE_PRIMITIVE(Null, AVRO_NULL)
+DEFINE_PRIMITIVE(std::string, AVRO_STRING)
+DEFINE_PRIMITIVE(std::vector<uint8_t>, AVRO_BYTES)
-template <>
-struct is_serializable<std::vector<uint8_t > > : public boost::true_type{};
} // namespace avro
Modified: hadoop/avro/trunk/src/c++/api/AvroTypes.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/AvroTypes.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/AvroTypes.hh (original)
+++ hadoop/avro/trunk/src/c++/api/AvroTypes.hh Thu Jun 25 19:12:45 2009
@@ -1,19 +0,0 @@
-#ifndef avro_AvroTypes_hh__
-#define avro_AvroTypes_hh__
-
-#include <boost/static_assert.hpp>
-#include "AvroTraits.hh"
-
-namespace avro {
-
-/// Null is an empty struct, convenient for representing null type in generic functions.
-
-struct Null {};
-
-template <>
-struct is_serializable<Null> : public boost::true_type{};
-
-
-} // namespace avro
-
-#endif
Modified: hadoop/avro/trunk/src/c++/api/Serializer.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/Serializer.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/Serializer.hh (original)
+++ hadoop/avro/trunk/src/c++/api/Serializer.hh Thu Jun 25 19:12:45 2009
@@ -3,105 +3,97 @@
#include <boost/noncopyable.hpp>
-#include "OutputStreamer.hh"
-#include "Zigzag.hh"
+#include "Writer.hh"
+#include "ValidatingWriter.hh"
namespace avro {
-/// Class for writing avro data to a stream.
+/// Class that wraps a Writer or ValidatingWriter with an interface that uses
+/// explicit put* names instead of putValue
+template<class Writer>
class Serializer : private boost::noncopyable
{
public:
+ /// Constructor only works with Writer
explicit Serializer(OutputStreamer &out) :
- out_(out)
+ writer_(out)
{}
- void putNull() {}
+ /// Constructor only works with ValidatingWriter
+ Serializer(const ValidSchema &schema, OutputStreamer &out) :
+ writer_(schema, out)
+ {}
+
+ void putNull() {
+ writer_.putValue(Null());
+ }
void putBool(bool val) {
- int8_t byte = (val != 0);
- out_.putByte(byte);
+ writer_.putValue(val);
}
void putInt(int32_t val) {
- boost::array<uint8_t, 5> bytes;
- size_t size = encodeInt32(val, bytes);
- out_.putBytes(bytes.data(), size);
+ writer_.putValue(val);
}
void putLong(int64_t val) {
- boost::array<uint8_t, 9> bytes;
- size_t size = encodeInt64(val, bytes);
- out_.putBytes(bytes.data(), size);
+ writer_.putValue(val);
}
void putFloat(float val) {
- union {
- float f;
- int32_t i;
- } v;
-
- v.f = val;
- out_.putWord(v.i);
+ writer_.putValue(val);
}
void putDouble(double val) {
- union {
- double d;
- int64_t i;
- } v;
-
- v.d = val;
- out_.putLongWord(v.i);
+ writer_.putValue(val);
}
- void putBytes(const uint8_t *val, size_t size) {
- this->putLong(size);
- out_.putBytes(val, size);
+ void putBytes(const void *val, size_t size) {
+ writer_.putBytes(val);
}
void putFixed(const uint8_t *val, size_t size) {
- out_.putBytes(val, size);
+ writer_.putFixed(val, size);
}
void putString(const std::string &val) {
- putBytes(reinterpret_cast<const uint8_t *>(val.c_str()), val.size());
+ writer_.putValue(val);
}
- /* here for compatibility with ValidatingSerializer in templates: */
-
- void beginRecord() {}
+ void beginRecord() {
+ writer_.beginRecord();
+ }
void beginArrayBlock(int64_t size) {
- putLong(size);
+ writer_.beginArrayBlock(size);
}
void endArray() {
- putLong(0);
+ writer_.endArray();
}
void beginMapBlock(int64_t size) {
- putLong(size);
+ writer_.beginMapBlock(size);
}
void endMap() {
- putLong(0);
+ writer_.endMap();
}
void beginUnion(int64_t choice) {
- putLong(choice);
+ writer_.beginUnion(choice);
}
void beginEnum(int64_t choice) {
- putLong(choice);
+ writer_.beginEnum(choice);
}
private:
- OutputStreamer &out_;
+ Writer writer_;
};
Modified: hadoop/avro/trunk/src/c++/api/Types.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/Types.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/Types.hh (original)
+++ hadoop/avro/trunk/src/c++/api/Types.hh Thu Jun 25 19:12:45 2009
@@ -42,6 +42,9 @@
std::ostream &operator<< (std::ostream &os, const avro::Type type);
+/// define a type to identify Null in template functions
+struct Null {};
+
} // namespace avro
Modified: hadoop/avro/trunk/src/c++/api/ValidatingSerializer.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/ValidatingSerializer.hh?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/api/ValidatingSerializer.hh (original)
+++ hadoop/avro/trunk/src/c++/api/ValidatingSerializer.hh Thu Jun 25 19:12:45 2009
@@ -1,83 +0,0 @@
-#ifndef avro_ValidatingSerializer_hh__
-#define avro_ValidatingSerializer_hh__
-
-#include <boost/noncopyable.hpp>
-
-#include "Serializer.hh"
-#include "Validator.hh"
-
-namespace avro {
-
-class ValidSchema;
-class OutputStreamer;
-
-/// This class walks the parse tree as data is being serialized, and throws if
-/// attempt to serialize a data type does not match the type expected in the
-/// schema.
-
-class ValidatingSerializer : private boost::noncopyable
-{
-
- public:
-
- ValidatingSerializer(const ValidSchema &schema, OutputStreamer &out);
-
- void putNull();
-
- void putBool(bool val);
-
- void putInt(int32_t val);
-
- void putLong(int64_t val);
-
- void putFloat(float val);
-
- void putDouble(double val);
-
- void putString(const std::string &val);
-
- void putBytes(const uint8_t *val, size_t size);
-
- void putFixed(const uint8_t *val, size_t size) {
- checkSafeToPut(AVRO_FIXED);
- checkSizeExpected(size);
- serializer_.putFixed(val, size);
- validator_.advance();
- }
-
- void beginRecord();
-
- void beginArrayBlock(int64_t size);
- void endArray();
-
- void beginMapBlock(int64_t size);
- void endMap();
-
- void beginUnion(int64_t choice);
-
- void beginEnum(int64_t choice);
-
- private:
-
- void putCount(int64_t count);
-
- void checkSafeToPut(Type type) const {
- if(! validator_.typeIsExpected(type)) {
- throw Exception("Type does not match schema");
- }
- }
-
- void checkSizeExpected(int size) const {
- if(validator_.nextSizeExpected() != size) {
- throw Exception("Wrong size of for fixed");
- }
- }
-
- Validator validator_;
- Serializer serializer_;
-
-};
-
-} // namespace avro
-
-#endif
Added: hadoop/avro/trunk/src/c++/api/ValidatingWriter.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/ValidatingWriter.hh?rev=788469&view=auto
==============================================================================
--- hadoop/avro/trunk/src/c++/api/ValidatingWriter.hh (added)
+++ hadoop/avro/trunk/src/c++/api/ValidatingWriter.hh Thu Jun 25 19:12:45 2009
@@ -0,0 +1,83 @@
+#ifndef avro_ValidatingWriter_hh__
+#define avro_ValidatingWriter_hh__
+
+#include <boost/noncopyable.hpp>
+
+#include "Writer.hh"
+#include "Validator.hh"
+#include "AvroTraits.hh"
+
+namespace avro {
+
+class ValidSchema;
+class OutputStreamer;
+
+/// This class walks the parse tree as data is being serialized, and throws if
+/// attempt to serialize a data type does not match the type expected in the
+/// schema.
+
+class ValidatingWriter : private boost::noncopyable
+{
+
+ public:
+
+ ValidatingWriter(const ValidSchema &schema, OutputStreamer &out);
+
+ template<typename T>
+ void putValue(T val) {
+ checkSafeToPut(type_to_avro<T>::type);
+ writer_.putValue(val);
+ validator_.advance();
+ }
+
+ void putValue(const std::string &val) {
+ checkSafeToPut(type_to_avro<std::string>::type);
+ writer_.putValue(val);
+ validator_.advance();
+ }
+
+ void putBytes(const void *val, size_t size);
+
+ void putFixed(const uint8_t *val, size_t size) {
+ checkSafeToPut(AVRO_FIXED);
+ checkSizeExpected(size);
+ writer_.putFixed(val, size);
+ validator_.advance();
+ }
+
+ void beginRecord();
+
+ void beginArrayBlock(int64_t size);
+ void endArray();
+
+ void beginMapBlock(int64_t size);
+ void endMap();
+
+ void beginUnion(int64_t choice);
+
+ void beginEnum(int64_t choice);
+
+ private:
+
+ void putCount(int64_t count);
+
+ void checkSafeToPut(Type type) const {
+ if(! validator_.typeIsExpected(type)) {
+ throw Exception("Type does not match schema");
+ }
+ }
+
+ void checkSizeExpected(int size) const {
+ if(validator_.nextSizeExpected() != size) {
+ throw Exception("Wrong size of for fixed");
+ }
+ }
+
+ Validator validator_;
+ Writer writer_;
+
+};
+
+} // namespace avro
+
+#endif
Added: hadoop/avro/trunk/src/c++/api/Writer.hh
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/api/Writer.hh?rev=788469&view=auto
==============================================================================
--- hadoop/avro/trunk/src/c++/api/Writer.hh (added)
+++ hadoop/avro/trunk/src/c++/api/Writer.hh Thu Jun 25 19:12:45 2009
@@ -0,0 +1,109 @@
+#ifndef avro_Writer_hh__
+#define avro_Writer_hh__
+
+#include <boost/noncopyable.hpp>
+
+#include "OutputStreamer.hh"
+#include "Zigzag.hh"
+#include "Types.hh"
+
+namespace avro {
+
+/// Class for writing avro data to a stream.
+
+class Writer : private boost::noncopyable
+{
+
+ public:
+
+ explicit Writer(OutputStreamer &out) :
+ out_(out)
+ {}
+
+ void putValue(const Null &) {}
+
+ void putValue(bool val) {
+ int8_t byte = (val != 0);
+ out_.putByte(byte);
+ }
+
+ void putValue(int32_t val) {
+ boost::array<uint8_t, 5> bytes;
+ size_t size = encodeInt32(val, bytes);
+ out_.putBytes(bytes.data(), size);
+ }
+
+ void putValue(int64_t val) {
+ boost::array<uint8_t, 9> bytes;
+ size_t size = encodeInt64(val, bytes);
+ out_.putBytes(bytes.data(), size);
+ }
+
+ void putValue(float val) {
+ union {
+ float f;
+ int32_t i;
+ } v;
+
+ v.f = val;
+ out_.putWord(v.i);
+ }
+
+ void putValue(double val) {
+ union {
+ double d;
+ int64_t i;
+ } v;
+
+ v.d = val;
+ out_.putLongWord(v.i);
+ }
+
+ void putValue(const std::string &val) {
+ putBytes(reinterpret_cast<const uint8_t *>(val.c_str()), val.size());
+ }
+
+ void putBytes(const void *val, size_t size) {
+ this->putValue(static_cast<int64_t>(size));
+ out_.putBytes(reinterpret_cast<const uint8_t *>(val), size);
+ }
+
+ void putFixed(const uint8_t *val, size_t size) {
+ out_.putBytes(val, size);
+ }
+
+ void beginRecord() {}
+
+ void beginArrayBlock(int64_t size) {
+ this->putValue(static_cast<int64_t>(size));
+ }
+
+ void endArray() {
+ out_.putByte(0);
+ }
+
+ void beginMapBlock(int64_t size) {
+ this->putValue(static_cast<int64_t>(size));
+ }
+
+ void endMap() {
+ out_.putByte(0);
+ }
+
+ void beginUnion(int64_t choice) {
+ this->putValue(static_cast<int64_t>(choice));
+ }
+
+ void beginEnum(int64_t choice) {
+ this->putValue(static_cast<int64_t>(choice));
+ }
+
+ private:
+
+ OutputStreamer &out_;
+
+};
+
+} // namespace avro
+
+#endif
Modified: hadoop/avro/trunk/src/c++/impl/ValidatingSerializer.cc
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/impl/ValidatingSerializer.cc?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/impl/ValidatingSerializer.cc (original)
+++ hadoop/avro/trunk/src/c++/impl/ValidatingSerializer.cc Thu Jun 25 19:12:45 2009
@@ -1,139 +0,0 @@
-#include <boost/static_assert.hpp>
-
-#include "ValidatingSerializer.hh"
-#include "ValidSchema.hh"
-#include "OutputStreamer.hh"
-
-namespace avro {
-
-ValidatingSerializer::ValidatingSerializer(const ValidSchema &schema, OutputStreamer &out) :
- validator_(schema),
- serializer_(out)
-{ }
-
-void
-ValidatingSerializer::putNull()
-{
- checkSafeToPut(AVRO_NULL);
- serializer_.putNull();
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putInt(int32_t val)
-{
- checkSafeToPut(AVRO_INT);
- serializer_.putInt(val);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putLong(int64_t val)
-{
- checkSafeToPut(AVRO_LONG);
- serializer_.putLong(val);
- validator_.advance();
-}
-
-
-void
-ValidatingSerializer::putFloat(float val)
-{
- checkSafeToPut(AVRO_FLOAT);
- serializer_.putFloat(val);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putDouble(double val)
-{
- checkSafeToPut(AVRO_DOUBLE);
- serializer_.putDouble(val);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putBool(bool val)
-{
- checkSafeToPut(AVRO_BOOL);
- serializer_.putBool(val);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putString(const std::string &val)
-{
- checkSafeToPut(AVRO_STRING);
- serializer_.putString(val);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putBytes(const uint8_t *val, size_t size)
-{
- checkSafeToPut(AVRO_BYTES);
- serializer_.putBytes(val, size);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::putCount(int64_t count)
-{
- checkSafeToPut(AVRO_LONG);
- serializer_.putLong(count);
- validator_.advanceWithCount(count);
-}
-
-void
-ValidatingSerializer::beginRecord()
-{
- checkSafeToPut(AVRO_RECORD);
- validator_.advance();
-}
-
-void
-ValidatingSerializer::beginArrayBlock(int64_t size)
-{
- checkSafeToPut(AVRO_ARRAY);
- validator_.advance();
- putCount(size);
-}
-
-void
-ValidatingSerializer::endArray()
-{
- beginArrayBlock(0);
-}
-
-void
-ValidatingSerializer::beginMapBlock(int64_t size)
-{
- checkSafeToPut(AVRO_MAP);
- validator_.advance();
- putCount(size);
-}
-
-void
-ValidatingSerializer::endMap()
-{
- beginMapBlock(0);
-}
-
-void
-ValidatingSerializer::beginUnion(int64_t choice)
-{
- checkSafeToPut(AVRO_UNION);
- validator_.advance();
- putCount(choice);
-}
-
-void
-ValidatingSerializer::beginEnum(int64_t choice)
-{
- checkSafeToPut(AVRO_ENUM);
- validator_.advance();
- putCount(choice);
-}
-
-
-} // namepspace avro
Added: hadoop/avro/trunk/src/c++/impl/ValidatingWriter.cc
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/impl/ValidatingWriter.cc?rev=788469&view=auto
==============================================================================
--- hadoop/avro/trunk/src/c++/impl/ValidatingWriter.cc (added)
+++ hadoop/avro/trunk/src/c++/impl/ValidatingWriter.cc Thu Jun 25 19:12:45 2009
@@ -0,0 +1,83 @@
+#include <boost/static_assert.hpp>
+
+#include "ValidatingWriter.hh"
+#include "ValidSchema.hh"
+#include "OutputStreamer.hh"
+#include "AvroTraits.hh"
+
+namespace avro {
+
+ValidatingWriter::ValidatingWriter(const ValidSchema &schema, OutputStreamer &out) :
+ validator_(schema),
+ writer_(out)
+{ }
+
+void
+ValidatingWriter::putBytes(const void *val, size_t size)
+{
+ checkSafeToPut(AVRO_BYTES);
+ writer_.putBytes(val, size);
+ validator_.advance();
+}
+
+void
+ValidatingWriter::putCount(int64_t count)
+{
+ checkSafeToPut(AVRO_LONG);
+ writer_.putValue(count);
+ validator_.advanceWithCount(count);
+}
+
+void
+ValidatingWriter::beginRecord()
+{
+ checkSafeToPut(AVRO_RECORD);
+ validator_.advance();
+}
+
+void
+ValidatingWriter::beginArrayBlock(int64_t size)
+{
+ checkSafeToPut(AVRO_ARRAY);
+ validator_.advance();
+ putCount(size);
+}
+
+void
+ValidatingWriter::endArray()
+{
+ beginArrayBlock(0);
+}
+
+void
+ValidatingWriter::beginMapBlock(int64_t size)
+{
+ checkSafeToPut(AVRO_MAP);
+ validator_.advance();
+ putCount(size);
+}
+
+void
+ValidatingWriter::endMap()
+{
+ beginMapBlock(0);
+}
+
+void
+ValidatingWriter::beginUnion(int64_t choice)
+{
+ checkSafeToPut(AVRO_UNION);
+ validator_.advance();
+ putCount(choice);
+}
+
+void
+ValidatingWriter::beginEnum(int64_t choice)
+{
+ checkSafeToPut(AVRO_ENUM);
+ validator_.advance();
+ putCount(choice);
+}
+
+
+} // namepspace avro
Modified: hadoop/avro/trunk/src/c++/test/testgen.cc
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/test/testgen.cc?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/test/testgen.cc (original)
+++ hadoop/avro/trunk/src/c++/test/testgen.cc Thu Jun 25 19:12:45 2009
@@ -7,7 +7,6 @@
#include "OutputStreamer.hh"
#include "InputStreamer.hh"
#include "Serializer.hh"
-#include "ValidatingSerializer.hh"
#include "Parser.hh"
#include "ValidatingParser.hh"
#include "ValidSchema.hh"
@@ -16,17 +15,17 @@
void serialize(const avrouser::RootRecord &rec)
{
avro::ScreenStreamer os;
- avro::Serializer s (os);
+ avro::Writer writer(os);
- avro::serialize(s, rec);
+ avro::serialize(writer, rec);
}
void serializeValid(const avro::ValidSchema &valid, const avrouser::RootRecord &rec)
{
avro::ScreenStreamer os;
- avro::ValidatingSerializer s (valid, os);
+ avro::ValidatingWriter writer(valid, os);
- avro::serialize(s, rec);
+ avro::serialize(writer, rec);
}
void checkArray(const avrouser::Array_of_double &a1, const avrouser::Array_of_double &a2)
@@ -79,7 +78,7 @@
{
std::ostringstream ostring;
avro::OStreamer os(ostring);
- avro::Serializer s (os);
+ avro::Writer s (os);
avro::serialize(s, myRecord);
@@ -96,7 +95,7 @@
{
std::ostringstream ostring;
avro::OStreamer os(ostring);
- avro::ValidatingSerializer s (valid, os);
+ avro::ValidatingWriter s (valid, os);
avro::serialize(s, myRecord);
Modified: hadoop/avro/trunk/src/c++/test/unittest.cc
URL: http://svn.apache.org/viewvc/hadoop/avro/trunk/src/c%2B%2B/test/unittest.cc?rev=788469&r1=788468&r2=788469&view=diff
==============================================================================
--- hadoop/avro/trunk/src/c++/test/unittest.cc (original)
+++ hadoop/avro/trunk/src/c++/test/unittest.cc Thu Jun 25 19:12:45 2009
@@ -10,7 +10,6 @@
#include "OutputStreamer.hh"
#include "Serializer.hh"
#include "Parser.hh"
-#include "ValidatingSerializer.hh"
#include "ValidatingParser.hh"
#include "SymbolMap.hh"
@@ -131,7 +130,7 @@
void printEncoding() {
std::cout << "Encoding\n";
ScreenStreamer os;
- Serializer s(os);
+ Serializer<Writer> s(os);
writeEncoding(s, 0);
}
@@ -139,7 +138,7 @@
{
std::cout << "Validating Encoding " << path << "\n";
ScreenStreamer os;
- ValidatingSerializer s(schema_, os);
+ Serializer<ValidatingWriter> s(schema_, os);
writeEncoding(s, path);
}
@@ -147,7 +146,7 @@
{
std::ofstream out("test.avro");
OStreamer os(out);
- ValidatingSerializer s(schema_, os);
+ Serializer<ValidatingWriter> s(schema_, os);
writeEncoding(s, path);
}
@@ -388,7 +387,7 @@
void serializeNoRecurse(OutputStreamer &os)
{
std::cout << "No recurse\n";
- ValidatingSerializer s(schema_, os);
+ Serializer<ValidatingWriter> s(schema_, os);
s.beginRecord();
s.putLong(1);
s.beginUnion(0);
@@ -399,7 +398,7 @@
void serializeRecurse(OutputStreamer &os)
{
std::cout << "Recurse\n";
- ValidatingSerializer s(schema_, os);
+ Serializer<ValidatingWriter> s(schema_, os);
s.beginRecord();
s.putLong(1);
s.beginUnion(1);
@@ -489,13 +488,12 @@
float f = 200.0;
ScreenStreamer os;
- Serializer s(os);
+ Writer writer(os);
- serialize(s, val);
- serialize(s, Null());
- serialize(s, f);
+ serialize(writer, val);
+ serialize(writer, Null());
+ serialize(writer, f);
-
}
};