THRIFT-922. cpp: Convert protocol classes to use non-virtual functions

Updated the thrift protocol classes to use non-virtual calls for most
functions.  The correct implementation is determined at compile time via
templates now.  Only the base TProtocol class falls back to using
virtual function calls.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@1005135 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/cpp/src/protocol/TProtocolTap.h b/lib/cpp/src/protocol/TProtocolTap.h
index 5580216..26fbd3a 100644
--- a/lib/cpp/src/protocol/TProtocolTap.h
+++ b/lib/cpp/src/protocol/TProtocolTap.h
@@ -20,7 +20,7 @@
 #ifndef _THRIFT_PROTOCOL_TPROTOCOLTAP_H_
 #define _THRIFT_PROTOCOL_TPROTOCOLTAP_H_ 1
 
-#include <protocol/TOneWayProtocol.h>
+#include <protocol/TVirtualProtocol.h>
 
 namespace apache { namespace thrift { namespace protocol {
 
@@ -32,44 +32,44 @@
  * second protocol object.
  *
  */
-class TProtocolTap : public TReadOnlyProtocol {
+class TProtocolTap : public TVirtualProtocol<TProtocolTap> {
  public:
    TProtocolTap(boost::shared_ptr<TProtocol> source,
                 boost::shared_ptr<TProtocol> sink)
-     : TReadOnlyProtocol(source->getTransport(), "TProtocolTap")
+     : TVirtualProtocol<TProtocolTap>(source->getTransport())
      , source_(source)
      , sink_(sink)
   {}
 
-  virtual uint32_t readMessageBegin(std::string& name,
-                                    TMessageType& messageType,
-                                    int32_t& seqid) {
+  uint32_t readMessageBegin(std::string& name,
+                            TMessageType& messageType,
+                            int32_t& seqid) {
     uint32_t rv = source_->readMessageBegin(name, messageType, seqid);
     sink_->writeMessageBegin(name, messageType, seqid);
     return rv;
   }
 
-  virtual uint32_t readMessageEnd() {
+  uint32_t readMessageEnd() {
     uint32_t rv = source_->readMessageEnd();
     sink_->writeMessageEnd();
     return rv;
   }
 
-  virtual uint32_t readStructBegin(std::string& name) {
+  uint32_t readStructBegin(std::string& name) {
     uint32_t rv = source_->readStructBegin(name);
     sink_->writeStructBegin(name.c_str());
     return rv;
   }
 
-  virtual uint32_t readStructEnd() {
+  uint32_t readStructEnd() {
     uint32_t rv = source_->readStructEnd();
     sink_->writeStructEnd();
     return rv;
   }
 
-  virtual uint32_t readFieldBegin(std::string& name,
-                                  TType& fieldType,
-                                  int16_t& fieldId) {
+  uint32_t readFieldBegin(std::string& name,
+                          TType& fieldType,
+                          int16_t& fieldId) {
     uint32_t rv = source_->readFieldBegin(name, fieldType, fieldId);
     if (fieldType == T_STOP) {
       sink_->writeFieldStop();
@@ -80,98 +80,96 @@
   }
 
 
-  virtual uint32_t readFieldEnd() {
+  uint32_t readFieldEnd() {
     uint32_t rv = source_->readFieldEnd();
     sink_->writeFieldEnd();
     return rv;
   }
 
-  virtual uint32_t readMapBegin(TType& keyType,
-                                TType& valType,
-                                uint32_t& size) {
+  uint32_t readMapBegin(TType& keyType,
+                        TType& valType,
+                        uint32_t& size) {
     uint32_t rv = source_->readMapBegin(keyType, valType, size);
     sink_->writeMapBegin(keyType, valType, size);
     return rv;
   }
 
 
-  virtual uint32_t readMapEnd() {
+  uint32_t readMapEnd() {
     uint32_t rv = source_->readMapEnd();
     sink_->writeMapEnd();
     return rv;
   }
 
-  virtual uint32_t readListBegin(TType& elemType,
-                                 uint32_t& size) {
+  uint32_t readListBegin(TType& elemType, uint32_t& size) {
     uint32_t rv = source_->readListBegin(elemType, size);
     sink_->writeListBegin(elemType, size);
     return rv;
   }
 
 
-  virtual uint32_t readListEnd() {
+  uint32_t readListEnd() {
     uint32_t rv = source_->readListEnd();
     sink_->writeListEnd();
     return rv;
   }
 
-  virtual uint32_t readSetBegin(TType& elemType,
-                                uint32_t& size) {
+  uint32_t readSetBegin(TType& elemType, uint32_t& size) {
     uint32_t rv = source_->readSetBegin(elemType, size);
     sink_->writeSetBegin(elemType, size);
     return rv;
   }
 
 
-  virtual uint32_t readSetEnd() {
+  uint32_t readSetEnd() {
     uint32_t rv = source_->readSetEnd();
     sink_->writeSetEnd();
     return rv;
   }
 
-  virtual uint32_t readBool(bool& value) {
+  uint32_t readBool(bool& value) {
     uint32_t rv = source_->readBool(value);
     sink_->writeBool(value);
     return rv;
   }
 
-  virtual uint32_t readByte(int8_t& byte) {
+  uint32_t readByte(int8_t& byte) {
     uint32_t rv = source_->readByte(byte);
     sink_->writeByte(byte);
     return rv;
   }
 
-  virtual uint32_t readI16(int16_t& i16) {
+  uint32_t readI16(int16_t& i16) {
     uint32_t rv = source_->readI16(i16);
     sink_->writeI16(i16);
     return rv;
   }
 
-  virtual uint32_t readI32(int32_t& i32) {
+  uint32_t readI32(int32_t& i32) {
     uint32_t rv = source_->readI32(i32);
     sink_->writeI32(i32);
     return rv;
   }
 
-  virtual uint32_t readI64(int64_t& i64) {
+  uint32_t readI64(int64_t& i64) {
     uint32_t rv = source_->readI64(i64);
     sink_->writeI64(i64);
     return rv;
   }
 
-  virtual uint32_t readDouble(double& dub) {
+  uint32_t readDouble(double& dub) {
     uint32_t rv = source_->readDouble(dub);
     sink_->writeDouble(dub);
     return rv;
   }
 
-  virtual uint32_t readString(std::string& str) {
+  uint32_t readString(std::string& str) {
     uint32_t rv = source_->readString(str);
     sink_->writeString(str);
     return rv;
   }
 
-  virtual uint32_t readBinary(std::string& str) {
+  uint32_t readBinary(std::string& str) {
     uint32_t rv = source_->readBinary(str);
     sink_->writeBinary(str);
     return rv;