From 64120001437477569524be5cfc1f5054b27ee807 Mon Sep 17 00:00:00 2001 From: David Reiss Date: Tue, 29 Apr 2008 23:12:24 +0000 Subject: [PATCH] C++: Make write{Struct,Field}Begin take "name" as a const char*. Summary: These methods previously took name as a const string&. While that way is more idiomatic, it requires a temporary string to be constructed when we pass a string literal (which is always). This was significantly slowing down the serialization of field-heavy structures. This change will break ABI compatibility, but the serialization speed boost with no external API changes is too important to pass up. Reviewed By: mcslee, aditya Test Plan: make check TracCamp Project: Thrift Revert Plan: ok git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665672 13f79535-47bb-0310-9956-ffa450edef68 --- lib/cpp/src/protocol/TBinaryProtocol.cpp | 4 ++-- lib/cpp/src/protocol/TBinaryProtocol.h | 4 ++-- lib/cpp/src/protocol/TDebugProtocol.cpp | 6 +++--- lib/cpp/src/protocol/TDebugProtocol.h | 4 ++-- lib/cpp/src/protocol/TDenseProtocol.cpp | 4 ++-- lib/cpp/src/protocol/TDenseProtocol.h | 4 ++-- lib/cpp/src/protocol/TJSONProtocol.cpp | 4 ++-- lib/cpp/src/protocol/TJSONProtocol.h | 4 ++-- lib/cpp/src/protocol/TOneWayProtocol.h | 4 ++-- lib/cpp/src/protocol/TProtocol.h | 4 ++-- lib/cpp/src/protocol/TProtocolTap.h | 4 ++-- 11 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/cpp/src/protocol/TBinaryProtocol.cpp b/lib/cpp/src/protocol/TBinaryProtocol.cpp index 2d983951..1c8cf551 100644 --- a/lib/cpp/src/protocol/TBinaryProtocol.cpp +++ b/lib/cpp/src/protocol/TBinaryProtocol.cpp @@ -75,7 +75,7 @@ uint32_t TBinaryProtocol::writeMessageEnd() { return 0; } -uint32_t TBinaryProtocol::writeStructBegin(const string& name) { +uint32_t TBinaryProtocol::writeStructBegin(const char* name) { return 0; } @@ -83,7 +83,7 @@ uint32_t TBinaryProtocol::writeStructEnd() { return 0; } -uint32_t TBinaryProtocol::writeFieldBegin(const string& name, +uint32_t TBinaryProtocol::writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { uint32_t wsize = 0; diff --git a/lib/cpp/src/protocol/TBinaryProtocol.h b/lib/cpp/src/protocol/TBinaryProtocol.h index dc47b3ad..a6a8983f 100644 --- a/lib/cpp/src/protocol/TBinaryProtocol.h +++ b/lib/cpp/src/protocol/TBinaryProtocol.h @@ -79,11 +79,11 @@ class TBinaryProtocol : public TProtocol { virtual uint32_t writeMessageEnd(); - uint32_t writeStructBegin(const std::string& name); + uint32_t writeStructBegin(const char* name); uint32_t writeStructEnd(); - uint32_t writeFieldBegin(const std::string& name, + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); diff --git a/lib/cpp/src/protocol/TDebugProtocol.cpp b/lib/cpp/src/protocol/TDebugProtocol.cpp index 4cc3df82..92e9d36e 100644 --- a/lib/cpp/src/protocol/TDebugProtocol.cpp +++ b/lib/cpp/src/protocol/TDebugProtocol.cpp @@ -152,10 +152,10 @@ uint32_t TDebugProtocol::writeMessageEnd() { return writeIndented(")\n"); } -uint32_t TDebugProtocol::writeStructBegin(const string& name) { +uint32_t TDebugProtocol::writeStructBegin(const char* name) { uint32_t size = 0; size += startItem(); - size += writePlain(name + " {\n"); + size += writePlain(string(name) + " {\n"); indentUp(); write_state_.push_back(STRUCT); return size; @@ -170,7 +170,7 @@ uint32_t TDebugProtocol::writeStructEnd() { return size; } -uint32_t TDebugProtocol::writeFieldBegin(const string& name, +uint32_t TDebugProtocol::writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { // sprintf(id_str, "%02d", fieldId); diff --git a/lib/cpp/src/protocol/TDebugProtocol.h b/lib/cpp/src/protocol/TDebugProtocol.h index 310c2b22..bac20982 100644 --- a/lib/cpp/src/protocol/TDebugProtocol.h +++ b/lib/cpp/src/protocol/TDebugProtocol.h @@ -75,11 +75,11 @@ class TDebugProtocol : public TWriteOnlyProtocol { virtual uint32_t writeMessageEnd(); - uint32_t writeStructBegin(const std::string& name); + uint32_t writeStructBegin(const char* name); uint32_t writeStructEnd(); - uint32_t writeFieldBegin(const std::string& name, + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); diff --git a/lib/cpp/src/protocol/TDenseProtocol.cpp b/lib/cpp/src/protocol/TDenseProtocol.cpp index dbb2d4a4..d1602a03 100644 --- a/lib/cpp/src/protocol/TDenseProtocol.cpp +++ b/lib/cpp/src/protocol/TDenseProtocol.cpp @@ -267,7 +267,7 @@ uint32_t TDenseProtocol::writeMessageEnd() { return 0; } -uint32_t TDenseProtocol::writeStructBegin(const string& name) { +uint32_t TDenseProtocol::writeStructBegin(const char* name) { uint32_t xfer = 0; // The TypeSpec stack should be empty if this is the top-level read/write. @@ -298,7 +298,7 @@ uint32_t TDenseProtocol::writeStructEnd() { return 0; } -uint32_t TDenseProtocol::writeFieldBegin(const string& name, +uint32_t TDenseProtocol::writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { uint32_t xfer = 0; diff --git a/lib/cpp/src/protocol/TDenseProtocol.h b/lib/cpp/src/protocol/TDenseProtocol.h index 713b57a7..5dd5a8c6 100644 --- a/lib/cpp/src/protocol/TDenseProtocol.h +++ b/lib/cpp/src/protocol/TDenseProtocol.h @@ -84,11 +84,11 @@ class TDenseProtocol : public TBinaryProtocol { virtual uint32_t writeMessageEnd(); - virtual uint32_t writeStructBegin(const std::string& name); + virtual uint32_t writeStructBegin(const char* name); virtual uint32_t writeStructEnd(); - virtual uint32_t writeFieldBegin(const std::string& name, + virtual uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); diff --git a/lib/cpp/src/protocol/TJSONProtocol.cpp b/lib/cpp/src/protocol/TJSONProtocol.cpp index b2ffeac1..a7564d18 100644 --- a/lib/cpp/src/protocol/TJSONProtocol.cpp +++ b/lib/cpp/src/protocol/TJSONProtocol.cpp @@ -546,7 +546,7 @@ uint32_t TJSONProtocol::writeMessageEnd() { return writeJSONArrayEnd(); } -uint32_t TJSONProtocol::writeStructBegin(const std::string& name) { +uint32_t TJSONProtocol::writeStructBegin(const char* name) { return writeJSONObjectStart(); } @@ -554,7 +554,7 @@ uint32_t TJSONProtocol::writeStructEnd() { return writeJSONObjectEnd(); } -uint32_t TJSONProtocol::writeFieldBegin(const std::string& name, +uint32_t TJSONProtocol::writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { uint32_t result = writeJSONInteger(fieldId); diff --git a/lib/cpp/src/protocol/TJSONProtocol.h b/lib/cpp/src/protocol/TJSONProtocol.h index ddf48c7b..efb8e636 100644 --- a/lib/cpp/src/protocol/TJSONProtocol.h +++ b/lib/cpp/src/protocol/TJSONProtocol.h @@ -150,11 +150,11 @@ class TJSONProtocol : public TProtocol { uint32_t writeMessageEnd(); - uint32_t writeStructBegin(const std::string& name); + uint32_t writeStructBegin(const char* name); uint32_t writeStructEnd(); - uint32_t writeFieldBegin(const std::string& name, + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId); diff --git a/lib/cpp/src/protocol/TOneWayProtocol.h b/lib/cpp/src/protocol/TOneWayProtocol.h index 3c31d1e4..dda113f9 100644 --- a/lib/cpp/src/protocol/TOneWayProtocol.h +++ b/lib/cpp/src/protocol/TOneWayProtocol.h @@ -183,7 +183,7 @@ class TReadOnlyProtocol : public TProtocol { } - uint32_t writeStructBegin(const std::string& name) { + uint32_t writeStructBegin(const char* name) { throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, subclass_ + " does not support writing (yet)."); } @@ -193,7 +193,7 @@ class TReadOnlyProtocol : public TProtocol { subclass_ + " does not support writing (yet)."); } - uint32_t writeFieldBegin(const std::string& name, + uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) { throw TProtocolException(TProtocolException::NOT_IMPLEMENTED, diff --git a/lib/cpp/src/protocol/TProtocol.h b/lib/cpp/src/protocol/TProtocol.h index aecc4e72..1e9ce995 100644 --- a/lib/cpp/src/protocol/TProtocol.h +++ b/lib/cpp/src/protocol/TProtocol.h @@ -117,11 +117,11 @@ class TProtocol { virtual uint32_t writeMessageEnd() = 0; - virtual uint32_t writeStructBegin(const std::string& name) = 0; + virtual uint32_t writeStructBegin(const char* name) = 0; virtual uint32_t writeStructEnd() = 0; - virtual uint32_t writeFieldBegin(const std::string& name, + virtual uint32_t writeFieldBegin(const char* name, const TType fieldType, const int16_t fieldId) = 0; diff --git a/lib/cpp/src/protocol/TProtocolTap.h b/lib/cpp/src/protocol/TProtocolTap.h index 1259598c..162f7831 100644 --- a/lib/cpp/src/protocol/TProtocolTap.h +++ b/lib/cpp/src/protocol/TProtocolTap.h @@ -45,7 +45,7 @@ class TProtocolTap : public TReadOnlyProtocol { virtual uint32_t readStructBegin(std::string& name) { uint32_t rv = source_->readStructBegin(name); - sink_->writeStructBegin(name); + sink_->writeStructBegin(name.c_str()); return rv; } @@ -62,7 +62,7 @@ class TProtocolTap : public TReadOnlyProtocol { if (fieldType == T_STOP) { sink_->writeFieldStop(); } else { - sink_->writeFieldBegin(name, fieldType, fieldId); + sink_->writeFieldBegin(name.c_str(), fieldType, fieldId); } return rv; } -- 2.17.1