aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google
diff options
context:
space:
mode:
authorGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-07-24 01:00:35 +0000
committerGravatar kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-07-24 01:00:35 +0000
commitd2fd0638c309113ccae3731a58e30419f522269a (patch)
tree19765ef6018015a1ae7a84ead0dd13592c2442b5 /src/google
parent31afcd730b279a6aa810cee447757725a7031353 (diff)
Down-integrate some code from an internal branch. (More to come.)
Diffstat (limited to 'src/google')
-rw-r--r--src/google/protobuf/compiler/cpp/cpp_helpers.cc10
-rw-r--r--src/google/protobuf/compiler/cpp/cpp_unittest.cc14
-rw-r--r--src/google/protobuf/message.h10
-rw-r--r--src/google/protobuf/unittest.proto10
4 files changed, 38 insertions, 6 deletions
diff --git a/src/google/protobuf/compiler/cpp/cpp_helpers.cc b/src/google/protobuf/compiler/cpp/cpp_helpers.cc
index 070fde55..595aeaeb 100644
--- a/src/google/protobuf/compiler/cpp/cpp_helpers.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_helpers.cc
@@ -227,7 +227,15 @@ string DefaultValue(const FieldDescriptor* field) {
case FieldDescriptor::CPPTYPE_DOUBLE:
return SimpleDtoa(field->default_value_double());
case FieldDescriptor::CPPTYPE_FLOAT:
- return SimpleFtoa(field->default_value_float());
+ {
+ // If floating point value contains a period (.) or an exponent (either
+ // E or e), then append suffix 'f' to make it a floating-point literal.
+ string float_value = SimpleFtoa(field->default_value_float());
+ if (float_value.find_first_of(".eE") != string::npos) {
+ float_value.push_back('f');
+ }
+ return float_value;
+ }
case FieldDescriptor::CPPTYPE_BOOL:
return field->default_value_bool() ? "true" : "false";
case FieldDescriptor::CPPTYPE_ENUM:
diff --git a/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/src/google/protobuf/compiler/cpp/cpp_unittest.cc
index ea9cc32d..cabf08fd 100644
--- a/src/google/protobuf/compiler/cpp/cpp_unittest.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_unittest.cc
@@ -50,9 +50,11 @@
#include <google/protobuf/unittest_optimize_for.pb.h>
#include <google/protobuf/unittest_embed_optimize_for.pb.h>
#include <google/protobuf/test_util.h>
+#include <google/protobuf/compiler/cpp/cpp_helpers.h>
#include <google/protobuf/compiler/cpp/cpp_test_bad_identifiers.pb.h>
#include <google/protobuf/compiler/importer.h>
#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/io/tokenizer.h>
#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/descriptor.h>
#include <google/protobuf/descriptor.pb.h>
@@ -73,6 +75,18 @@ namespace cpp {
// Can't use an anonymous namespace here due to brokenness of Tru64 compiler.
namespace cpp_unittest {
+TEST(ExtremeDefaultValues, FloatingPoint) {
+ const unittest::TestExtremeDefaultValues& extreme_default =
+ unittest::TestExtremeDefaultValues::default_instance();
+
+ EXPECT_EQ(0.0f, extreme_default.zero_float());
+ EXPECT_EQ(1.0f, extreme_default.one_float());
+ EXPECT_EQ(1.5f, extreme_default.small_float());
+ EXPECT_EQ(-1.0f, extreme_default.negative_one_float());
+ EXPECT_EQ(-1.5f, extreme_default.negative_float());
+ EXPECT_EQ(2.0e8f, extreme_default.large_float());
+ EXPECT_EQ(-8e-28f, extreme_default.small_negative_float());
+}
class MockErrorCollector : public MultiFileErrorCollector {
public:
diff --git a/src/google/protobuf/message.h b/src/google/protobuf/message.h
index 0f0ef887..41716057 100644
--- a/src/google/protobuf/message.h
+++ b/src/google/protobuf/message.h
@@ -223,6 +223,11 @@ class LIBPROTOBUF_EXPORT Message {
// See Reflection::GetUnknownFields() for more on unknown fields.
virtual void DiscardUnknownFields();
+ // Computes (an estimate of) the total number of bytes currently used for
+ // storing the message in memory. The default implementation calls the
+ // Reflection object's SpaceUsed() method.
+ virtual int SpaceUsed() const;
+
// Debugging -------------------------------------------------------
// Generates a human readable form of this message, useful for debugging
@@ -362,11 +367,6 @@ class LIBPROTOBUF_EXPORT Message {
// this, it MUST override SetCachedSize().
virtual int ByteSize() const;
- // Computes (an estimate of) the total number of bytes currently used for
- // storing the message in memory. The default implementation calls the
- // Reflection object's SpaceUsed() method.
- virtual int SpaceUsed() const;
-
// Serializes the message without recomputing the size. The message must
// not have changed since the last call to ByteSize(); if it has, the results
// are undefined.
diff --git a/src/google/protobuf/unittest.proto b/src/google/protobuf/unittest.proto
index 85a14652..03811de8 100644
--- a/src/google/protobuf/unittest.proto
+++ b/src/google/protobuf/unittest.proto
@@ -458,6 +458,16 @@ message TestExtremeDefaultValues {
// the UTF-8 text directly into this text file rather than escape it, but
// lots of people use editors that would be confused by this.)
optional string utf8_string = 6 [default = "\341\210\264"];
+
+ // Tests for single-precision floating-point values.
+ optional float zero_float = 7 [default = 0];
+ optional float one_float = 8 [default = 1];
+ optional float small_float = 9 [default = 1.5];
+ optional float negative_one_float = 10 [default = -1];
+ optional float negative_float = 11 [default = -1.5];
+ // Using exponents
+ optional float large_float = 12 [default = 2E8];
+ optional float small_negative_float = 13 [default = -8e-28];
}
// Test String and Bytes: string is for valid UTF-8 strings