Home | History | Annotate | Download | only in internal
      1 // Protocol Buffers - Google's data interchange format
      2 // Copyright 2008 Google Inc.  All rights reserved.
      3 // https://developers.google.com/protocol-buffers/
      4 //
      5 // Redistribution and use in source and binary forms, with or without
      6 // modification, are permitted provided that the following conditions are
      7 // met:
      8 //
      9 //     * Redistributions of source code must retain the above copyright
     10 // notice, this list of conditions and the following disclaimer.
     11 //     * Redistributions in binary form must reproduce the above
     12 // copyright notice, this list of conditions and the following disclaimer
     13 // in the documentation and/or other materials provided with the
     14 // distribution.
     15 //     * Neither the name of Google Inc. nor the names of its
     16 // contributors may be used to endorse or promote products derived from
     17 // this software without specific prior written permission.
     18 //
     19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30 
     31 #ifndef GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__
     32 #define GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__
     33 
     34 #include <memory>
     35 #ifndef _SHARED_PTR_H
     36 #include <google/protobuf/stubs/shared_ptr.h>
     37 #endif
     38 #include <string>
     39 #include <utility>
     40 
     41 #include <google/protobuf/stubs/common.h>
     42 #include <google/protobuf/stubs/logging.h>
     43 #include <google/protobuf/type.pb.h>
     44 #include <google/protobuf/repeated_field.h>
     45 #include <google/protobuf/stubs/stringpiece.h>
     46 #include <google/protobuf/stubs/strutil.h>
     47 #include <google/protobuf/stubs/status.h>
     48 #include <google/protobuf/stubs/statusor.h>
     49 
     50 
     51 namespace google {
     52 namespace protobuf {
     53 class Method;
     54 class Any;
     55 class Bool;
     56 class Option;
     57 class Field;
     58 class Type;
     59 class Enum;
     60 class EnumValue;
     61 }  // namespace protobuf
     62 
     63 
     64 namespace protobuf {
     65 namespace util {
     66 namespace converter {
     67 // Finds the tech option identified by option_name. Parses the boolean value and
     68 // returns it.
     69 // When the option with the given name is not found, default_value is returned.
     70 LIBPROTOBUF_EXPORT bool GetBoolOptionOrDefault(
     71     const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
     72     const string& option_name, bool default_value);
     73 
     74 // Returns int64 option value. If the option isn't found, returns the
     75 // default_value.
     76 LIBPROTOBUF_EXPORT int64 GetInt64OptionOrDefault(
     77     const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
     78     const string& option_name, int64 default_value);
     79 
     80 // Returns double option value. If the option isn't found, returns the
     81 // default_value.
     82 LIBPROTOBUF_EXPORT double GetDoubleOptionOrDefault(
     83     const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
     84     const string& option_name, double default_value);
     85 
     86 // Returns string option value. If the option isn't found, returns the
     87 // default_value.
     88 LIBPROTOBUF_EXPORT string GetStringOptionOrDefault(
     89     const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
     90     const string& option_name, const string& default_value);
     91 
     92 // Returns a boolean value contained in Any type.
     93 // TODO(skarvaje): Make these utilities dealing with Any types more generic,
     94 // add more error checking and move to a more public/sharable location so others
     95 // can use.
     96 LIBPROTOBUF_EXPORT bool GetBoolFromAny(const google::protobuf::Any& any);
     97 
     98 // Returns int64 value contained in Any type.
     99 LIBPROTOBUF_EXPORT int64 GetInt64FromAny(const google::protobuf::Any& any);
    100 
    101 // Returns double value contained in Any type.
    102 LIBPROTOBUF_EXPORT double GetDoubleFromAny(const google::protobuf::Any& any);
    103 
    104 // Returns string value contained in Any type.
    105 LIBPROTOBUF_EXPORT string GetStringFromAny(const google::protobuf::Any& any);
    106 
    107 // Returns the type string without the url prefix. e.g.: If the passed type is
    108 // 'type.googleapis.com/tech.type.Bool', the returned value is 'tech.type.Bool'.
    109 LIBPROTOBUF_EXPORT const StringPiece GetTypeWithoutUrl(StringPiece type_url);
    110 
    111 // Returns the simple_type with the base type url (kTypeServiceBaseUrl)
    112 // prefixed.
    113 //
    114 // E.g:
    115 // GetFullTypeWithUrl("google.protobuf.Timestamp") returns the string
    116 // "type.googleapis.com/google.protobuf.Timestamp".
    117 LIBPROTOBUF_EXPORT const string GetFullTypeWithUrl(StringPiece simple_type);
    118 
    119 // Finds and returns option identified by name and option_name within the
    120 // provided map. Returns NULL if none found.
    121 const google::protobuf::Option* FindOptionOrNull(
    122     const google::protobuf::RepeatedPtrField<google::protobuf::Option>& options,
    123     const string& option_name);
    124 
    125 // Finds and returns the field identified by field_name in the passed tech Type
    126 // object. Returns NULL if none found.
    127 const google::protobuf::Field* FindFieldInTypeOrNull(
    128     const google::protobuf::Type* type, StringPiece field_name);
    129 
    130 // Similar to FindFieldInTypeOrNull, but this looks up fields with given
    131 // json_name.
    132 const google::protobuf::Field* FindJsonFieldInTypeOrNull(
    133     const google::protobuf::Type* type, StringPiece json_name);
    134 
    135 // Finds and returns the EnumValue identified by enum_name in the passed tech
    136 // Enum object. Returns NULL if none found.
    137 const google::protobuf::EnumValue* FindEnumValueByNameOrNull(
    138     const google::protobuf::Enum* enum_type, StringPiece enum_name);
    139 
    140 // Finds and returns the EnumValue identified by value in the passed tech
    141 // Enum object. Returns NULL if none found.
    142 const google::protobuf::EnumValue* FindEnumValueByNumberOrNull(
    143     const google::protobuf::Enum* enum_type, int32 value);
    144 
    145 // Converts input to camel-case and returns it.
    146 LIBPROTOBUF_EXPORT string ToCamelCase(const StringPiece input);
    147 
    148 // Converts input to snake_case and returns it.
    149 LIBPROTOBUF_EXPORT string ToSnakeCase(StringPiece input);
    150 
    151 // Returns true if type_name represents a well-known type.
    152 LIBPROTOBUF_EXPORT bool IsWellKnownType(const string& type_name);
    153 
    154 // Returns true if 'bool_string' represents a valid boolean value. Only "true",
    155 // "false", "0" and "1" are allowed.
    156 LIBPROTOBUF_EXPORT bool IsValidBoolString(const string& bool_string);
    157 
    158 // Returns true if "field" is a protobuf map field based on its type.
    159 LIBPROTOBUF_EXPORT bool IsMap(const google::protobuf::Field& field,
    160            const google::protobuf::Type& type);
    161 
    162 // Returns true if the given type has special MessageSet wire format.
    163 bool IsMessageSetWireFormat(const google::protobuf::Type& type);
    164 
    165 // Infinity/NaN-aware conversion to string.
    166 LIBPROTOBUF_EXPORT string DoubleAsString(double value);
    167 LIBPROTOBUF_EXPORT string FloatAsString(float value);
    168 
    169 // Convert from int32, int64, uint32, uint64, double or float to string.
    170 template <typename T>
    171 string ValueAsString(T value) {
    172   return SimpleItoa(value);
    173 }
    174 
    175 template <>
    176 inline string ValueAsString(float value) {
    177   return FloatAsString(value);
    178 }
    179 
    180 template <>
    181 inline string ValueAsString(double value) {
    182   return DoubleAsString(value);
    183 }
    184 
    185 // Converts a string to float. Unlike safe_strtof, conversion will fail if the
    186 // value fits into double but not float (e.g., DBL_MAX).
    187 LIBPROTOBUF_EXPORT bool SafeStrToFloat(StringPiece str, float* value);
    188 }  // namespace converter
    189 }  // namespace util
    190 }  // namespace protobuf
    191 
    192 }  // namespace google
    193 #endif  // GOOGLE_PROTOBUF_UTIL_CONVERTER_UTILITY_H__
    194