|  | @@ -37,9 +37,6 @@
 | 
	
		
			
				|  |  |  #ifdef max
 | 
	
		
			
				|  |  |  #undef max  // Visual Studio defines this macro
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  | -#include <google/protobuf/stubs/type_traits.h>
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  |  #if defined(_MSC_VER) && !defined(_LIBCPP_STD_VER) && !_HAS_EXCEPTIONS
 | 
	
		
			
				|  |  |  // Work around bugs in MSVC <typeinfo> header when _HAS_EXCEPTIONS=0.
 | 
	
		
			
				|  |  |  #include <exception>
 | 
	
	
		
			
				|  | @@ -53,10 +50,13 @@ using type_info = ::type_info;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #include <google/protobuf/arena_impl.h>
 | 
	
		
			
				|  |  |  #include <google/protobuf/stubs/port.h>
 | 
	
		
			
				|  |  | +#include <type_traits>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace google {
 | 
	
		
			
				|  |  |  namespace protobuf {
 | 
	
		
			
				|  |  | -struct ArenaOptions;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +struct ArenaOptions;  // defined below
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }  // namespace protobuf
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace quality_webanswers {
 | 
	
	
		
			
				|  | @@ -66,27 +66,32 @@ void TempPrivateWorkAround(::google::protobuf::ArenaOptions* arena_options);
 | 
	
		
			
				|  |  |  }  // namespace quality_webanswers
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace protobuf {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Arena;          // defined below
 | 
	
		
			
				|  |  | +class Message;        // defined in message.h
 | 
	
		
			
				|  |  | +class MessageLite;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  namespace arena_metrics {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void EnableArenaMetrics(::google::protobuf::ArenaOptions* options);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  }  // namespace arena_metrics
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -class Arena;       // defined below
 | 
	
		
			
				|  |  | -class Message;     // message.h
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  namespace internal {
 | 
	
		
			
				|  |  | -struct ArenaStringPtr;  // arenastring.h
 | 
	
		
			
				|  |  | -class LazyField;   // lazy_field.h
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -template<typename Type>
 | 
	
		
			
				|  |  | -class GenericTypeHandler; // repeated_field.h
 | 
	
		
			
				|  |  | +struct ArenaStringPtr;     // defined in arenastring.h
 | 
	
		
			
				|  |  | +class LazyField;           // defined in lazy_field.h
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +template <typename Type>
 | 
	
		
			
				|  |  | +class GenericTypeHandler;  // defined in repeated_field.h
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Templated cleanup methods.
 | 
	
		
			
				|  |  | -template<typename T> void arena_destruct_object(void* object) {
 | 
	
		
			
				|  |  | +template <typename T>
 | 
	
		
			
				|  |  | +void arena_destruct_object(void* object) {
 | 
	
		
			
				|  |  |    reinterpret_cast<T*>(object)->~T();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -template<typename T> void arena_delete_object(void* object) {
 | 
	
		
			
				|  |  | +template <typename T>
 | 
	
		
			
				|  |  | +void arena_delete_object(void* object) {
 | 
	
		
			
				|  |  |    delete reinterpret_cast<T*>(object);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  inline void arena_free(void* object, size_t size) {
 | 
	
	
		
			
				|  | @@ -165,12 +170,12 @@ struct ArenaOptions {
 | 
	
		
			
				|  |  |    // intentionally want to avoid monitoring an allocation. (i.e. internal
 | 
	
		
			
				|  |  |    // allocations for managing the arena)
 | 
	
		
			
				|  |  |    void (*on_arena_allocation)(const std::type_info* allocated_type,
 | 
	
		
			
				|  |  | -      uint64 alloc_size, void* cookie);
 | 
	
		
			
				|  |  | +                              uint64 alloc_size, void* cookie);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Constants define default starting block size and max block size for
 | 
	
		
			
				|  |  |    // arena allocator behavior -- see descriptions above.
 | 
	
		
			
				|  |  |    static const size_t kDefaultStartBlockSize = 256;
 | 
	
		
			
				|  |  | -  static const size_t kDefaultMaxBlockSize   = 8192;
 | 
	
		
			
				|  |  | +  static const size_t kDefaultMaxBlockSize = 8192;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    friend void ::google::protobuf::arena_metrics::EnableArenaMetrics(ArenaOptions*);
 | 
	
		
			
				|  |  |    friend void quality_webanswers::TempPrivateWorkAround(ArenaOptions*);
 | 
	
	
		
			
				|  | @@ -285,70 +290,16 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    //
 | 
	
		
			
				|  |  |    // This function also accepts any type T that satisfies the arena message
 | 
	
		
			
				|  |  |    // allocation protocol, documented above.
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  |    template <typename T, typename... Args>
 | 
	
		
			
				|  |  |    GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessage(
 | 
	
		
			
				|  |  | -      ::google::protobuf::Arena* arena, Args&&... args) {
 | 
	
		
			
				|  |  | -    static_assert(
 | 
	
		
			
				|  |  | -        InternalHelper<T>::is_arena_constructable::value,
 | 
	
		
			
				|  |  | -        "CreateMessage can only construct types that are ArenaConstructable");
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(NULL, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateMessageInternal<T>(std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateMessage(::google::protobuf::Arena* arena) {
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  | -    static_assert(
 | 
	
		
			
				|  |  | -        InternalHelper<T>::is_arena_constructable::value,
 | 
	
		
			
				|  |  | -        "CreateMessage can only construct types that are ArenaConstructable");
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T;
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateMessageInternal<T>();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // One-argument form of CreateMessage. This is useful for constructing objects
 | 
	
		
			
				|  |  | -  // that implement the arena message construction protocol described above but
 | 
	
		
			
				|  |  | -  // take additional constructor arguments.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateMessage(::google::protobuf::Arena* arena, const Arg& arg) {
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  | -    static_assert(
 | 
	
		
			
				|  |  | -        InternalHelper<T>::is_arena_constructable::value,
 | 
	
		
			
				|  |  | -        "CreateMessage can only construct types that are ArenaConstructable");
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(NULL, arg);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateMessageInternal<T>(arg);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Two-argument form of CreateMessage. This is useful for constructing objects
 | 
	
		
			
				|  |  | -  // that implement the arena message construction protocol described above but
 | 
	
		
			
				|  |  | -  // take additional constructor arguments.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateMessage(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                          const Arg1& arg1,
 | 
	
		
			
				|  |  | -                          const Arg2& arg2) {
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  | +      Arena* arena, Args&&... args) {
 | 
	
		
			
				|  |  |      static_assert(
 | 
	
		
			
				|  |  |          InternalHelper<T>::is_arena_constructable::value,
 | 
	
		
			
				|  |  |          "CreateMessage can only construct types that are ArenaConstructable");
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(NULL, arg1, arg2);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateMessageInternal<T>(arg1, arg2);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +    // We must delegate to CreateMaybeMessage() and NOT CreateMessageInternal()
 | 
	
		
			
				|  |  | +    // because protobuf generated classes specialize CreateMaybeMessage() and we
 | 
	
		
			
				|  |  | +    // need to use that specialization for code size reasons.
 | 
	
		
			
				|  |  | +    return Arena::CreateMaybeMessage<T>(arena, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // API to create any objects on the arena. Note that only the object will
 | 
	
	
		
			
				|  | @@ -366,153 +317,11 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // (unless the destructor is trivial). Hence, from T's point of view, it is as
 | 
	
		
			
				|  |  |    // if the object were allocated on the heap (except that the underlying memory
 | 
	
		
			
				|  |  |    // is obtained from the arena).
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  |    template <typename T, typename... Args>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena, Args&&... args) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T();
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with one constructor argument for the created object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena, const Arg& arg) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with two constructor arguments for the created object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena, const Arg1& arg1, const Arg2& arg2) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg1, arg2);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with three constructor arguments for the created
 | 
	
		
			
				|  |  | -  // object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                   const Arg1& arg1,
 | 
	
		
			
				|  |  | -                   const Arg2& arg2,
 | 
	
		
			
				|  |  | -                   const Arg3& arg3) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2, arg3);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg1, arg2, arg3);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with four constructor arguments for the created
 | 
	
		
			
				|  |  | -  // object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                   const Arg1& arg1, const Arg2& arg2,
 | 
	
		
			
				|  |  | -                   const Arg3& arg3, const Arg4& arg4) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2, arg3, arg4);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg1, arg2, arg3, arg4);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with five constructor arguments for the created
 | 
	
		
			
				|  |  | -  // object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                   const Arg1& arg1, const Arg2& arg2,
 | 
	
		
			
				|  |  | -                   const Arg3& arg3, const Arg4& arg4,
 | 
	
		
			
				|  |  | -                   const Arg5& arg5) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2, arg3, arg4, arg5);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg1, arg2, arg3, arg4, arg5);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with six constructor arguments for the created
 | 
	
		
			
				|  |  | -  // object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5, typename Arg6>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                   const Arg1& arg1, const Arg2& arg2,
 | 
	
		
			
				|  |  | -                   const Arg3& arg3, const Arg4& arg4,
 | 
	
		
			
				|  |  | -                   const Arg5& arg5, const Arg6& arg6) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2, arg3, arg4, arg5, arg6);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg1, arg2, arg3, arg4, arg5, arg6);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with seven constructor arguments for the created
 | 
	
		
			
				|  |  | -  // object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5, typename Arg6, typename Arg7>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                   const Arg1& arg1, const Arg2& arg2,
 | 
	
		
			
				|  |  | -                   const Arg3& arg3, const Arg4& arg4,
 | 
	
		
			
				|  |  | -                   const Arg5& arg5, const Arg6& arg6,
 | 
	
		
			
				|  |  | -                   const Arg7& arg7) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -                                      arg1, arg2, arg3, arg4, arg5, arg6, arg7);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // Version of the above with eight constructor arguments for the created
 | 
	
		
			
				|  |  | -  // object.
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5, typename Arg6, typename Arg7,
 | 
	
		
			
				|  |  | -            typename Arg8>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* Create(::google::protobuf::Arena* arena,
 | 
	
		
			
				|  |  | -                   const Arg1& arg1, const Arg2& arg2,
 | 
	
		
			
				|  |  | -                   const Arg3& arg3, const Arg4& arg4,
 | 
	
		
			
				|  |  | -                   const Arg5& arg5, const Arg6& arg6,
 | 
	
		
			
				|  |  | -                   const Arg7& arg7, const Arg8& arg8) {
 | 
	
		
			
				|  |  | -    if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
 | 
	
		
			
				|  |  | -    } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(
 | 
	
		
			
				|  |  | -          google::protobuf::internal::has_trivial_destructor<T>::value,
 | 
	
		
			
				|  |  | -          arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* Create(Arena* arena,
 | 
	
		
			
				|  |  | +                                                           Args&&... args) {
 | 
	
		
			
				|  |  | +    return CreateNoMessage<T>(arena, is_arena_constructable<T>(),
 | 
	
		
			
				|  |  | +                              std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Create an array of object type T on the arena *without* invoking the
 | 
	
	
		
			
				|  | @@ -521,10 +330,14 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // To ensure safe uses, this function checks at compile time
 | 
	
		
			
				|  |  |    // (when compiled as C++11) that T is trivially default-constructible and
 | 
	
		
			
				|  |  |    // trivially destructible.
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateArray(::google::protobuf::Arena* arena, size_t num_elements) {
 | 
	
		
			
				|  |  | -    GOOGLE_CHECK_LE(num_elements,
 | 
	
		
			
				|  |  | -             std::numeric_limits<size_t>::max() / sizeof(T))
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateArray(
 | 
	
		
			
				|  |  | +      Arena* arena, size_t num_elements) {
 | 
	
		
			
				|  |  | +    static_assert(std::is_pod<T>::value,
 | 
	
		
			
				|  |  | +                  "CreateArray requires a trivially constructible type");
 | 
	
		
			
				|  |  | +    static_assert(std::is_trivially_destructible<T>::value,
 | 
	
		
			
				|  |  | +                  "CreateArray requires a trivially destructible type");
 | 
	
		
			
				|  |  | +    GOOGLE_CHECK_LE(num_elements, std::numeric_limits<size_t>::max() / sizeof(T))
 | 
	
		
			
				|  |  |          << "Requested size is too large to fit into size_t.";
 | 
	
		
			
				|  |  |      if (arena == NULL) {
 | 
	
		
			
				|  |  |        return static_cast<T*>(::operator new[](num_elements * sizeof(T)));
 | 
	
	
		
			
				|  | @@ -566,9 +379,9 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Adds |object| to a list of heap-allocated objects to be freed with |delete|
 | 
	
		
			
				|  |  |    // when the arena is destroyed or reset.
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
 | 
	
		
			
				|  |  | -  void Own(T* object) {
 | 
	
		
			
				|  |  | -    OwnInternal(object, google::protobuf::internal::is_convertible<T*, ::google::protobuf::Message*>());
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void Own(T* object) {
 | 
	
		
			
				|  |  | +    OwnInternal(object, std::is_convertible<T*, Message*>());
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Adds |object| to a list of objects whose destructors will be manually
 | 
	
	
		
			
				|  | @@ -576,8 +389,8 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // that it does not free the underlying memory with |delete|; hence, it is
 | 
	
		
			
				|  |  |    // normally only used for objects that are placement-newed into
 | 
	
		
			
				|  |  |    // arena-allocated memory.
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE
 | 
	
		
			
				|  |  | -  void OwnDestructor(T* object) {
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_NOINLINE void OwnDestructor(T* object) {
 | 
	
		
			
				|  |  |      if (object != NULL) {
 | 
	
		
			
				|  |  |        impl_.AddCleanup(object, &internal::arena_destruct_object<T>);
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -596,8 +409,9 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // message, or NULL otherwise. This differs from value->GetArena() in that the
 | 
	
		
			
				|  |  |    // latter is a virtual call, while this method is a templated call that
 | 
	
		
			
				|  |  |    // resolves at compile-time.
 | 
	
		
			
				|  |  | -  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static ::google::protobuf::Arena* GetArena(const T* value) {
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static Arena* GetArena(
 | 
	
		
			
				|  |  | +      const T* value) {
 | 
	
		
			
				|  |  |      return GetArenaInternal(value, is_arena_constructable<T>());
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -608,80 +422,89 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |      template <typename U>
 | 
	
		
			
				|  |  |      static double DestructorSkippable(...);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    typedef google::protobuf::internal::integral_constant<
 | 
	
		
			
				|  |  | +    typedef std::integral_constant<
 | 
	
		
			
				|  |  |          bool, sizeof(DestructorSkippable<T>(static_cast<const T*>(0))) ==
 | 
	
		
			
				|  |  |                        sizeof(char) ||
 | 
	
		
			
				|  |  | -                  google::protobuf::internal::has_trivial_destructor<T>::value>
 | 
	
		
			
				|  |  | +                  std::is_trivially_destructible<T>::value>
 | 
	
		
			
				|  |  |          is_destructor_skippable;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    template<typename U>
 | 
	
		
			
				|  |  | +    template <typename U>
 | 
	
		
			
				|  |  |      static char ArenaConstructable(
 | 
	
		
			
				|  |  |          const typename U::InternalArenaConstructable_*);
 | 
	
		
			
				|  |  | -    template<typename U>
 | 
	
		
			
				|  |  | +    template <typename U>
 | 
	
		
			
				|  |  |      static double ArenaConstructable(...);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    typedef google::protobuf::internal::integral_constant<bool, sizeof(ArenaConstructable<T>(
 | 
	
		
			
				|  |  | -                                              static_cast<const T*>(0))) ==
 | 
	
		
			
				|  |  | -                                              sizeof(char)>
 | 
	
		
			
				|  |  | +    typedef std::integral_constant<bool, sizeof(ArenaConstructable<T>(
 | 
	
		
			
				|  |  | +                                             static_cast<const T*>(0))) ==
 | 
	
		
			
				|  |  | +                                             sizeof(char)>
 | 
	
		
			
				|  |  |          is_arena_constructable;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  |      template <typename... Args>
 | 
	
		
			
				|  |  |      static T* Construct(void* ptr, Args&&... args) {
 | 
	
		
			
				|  |  |        return new (ptr) T(std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -    template <typename Arg1>
 | 
	
		
			
				|  |  | -    static T* Construct(void* ptr, const Arg1& arg1) {
 | 
	
		
			
				|  |  | -      return new (ptr) T(arg1);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    template <typename Arg1, typename Arg2>
 | 
	
		
			
				|  |  | -    static T* Construct(void* ptr, const Arg1& arg1, const Arg2& arg2) {
 | 
	
		
			
				|  |  | -      return new (ptr) T(arg1, arg2);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    template <typename Arg1, typename Arg2, typename Arg3>
 | 
	
		
			
				|  |  | -    static T* Construct(void* ptr, const Arg1& arg1,
 | 
	
		
			
				|  |  | -                        const Arg2& arg2, const Arg3& arg3) {
 | 
	
		
			
				|  |  | -      return new (ptr) T(arg1, arg2, arg3);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -#endif  // LANG_CXX11
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      static Arena* GetArena(const T* p) { return p->GetArenaNoVirtual(); }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      friend class Arena;
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // Helper typetrait that indicates support for arenas in a type T at compile
 | 
	
		
			
				|  |  | +  // Helper typetraits that indicates support for arenas in a type T at compile
 | 
	
		
			
				|  |  |    // time. This is public only to allow construction of higher-level templated
 | 
	
		
			
				|  |  | -  // utilities. is_arena_constructable<T>::value is true if the message type T
 | 
	
		
			
				|  |  | -  // has arena support enabled, and false otherwise.
 | 
	
		
			
				|  |  | +  // utilities.
 | 
	
		
			
				|  |  | +  //
 | 
	
		
			
				|  |  | +  // is_arena_constructable<T>::value is true if the message type T has arena
 | 
	
		
			
				|  |  | +  // support enabled, and false otherwise.
 | 
	
		
			
				|  |  | +  //
 | 
	
		
			
				|  |  | +  // is_destructor_skippable<T>::value is true if the message type T has told
 | 
	
		
			
				|  |  | +  // the arena that it is safe to skip the destructor, and false otherwise.
 | 
	
		
			
				|  |  |    //
 | 
	
		
			
				|  |  |    // This is inside Arena because only Arena has the friend relationships
 | 
	
		
			
				|  |  |    // necessary to see the underlying generated code traits.
 | 
	
		
			
				|  |  |    template <typename T>
 | 
	
		
			
				|  |  |    struct is_arena_constructable : InternalHelper<T>::is_arena_constructable {};
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  struct is_destructor_skippable : InternalHelper<T>::is_destructor_skippable {
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |   private:
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateMessageInternal(::google::protobuf::Arena* arena) {
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  | +  template <typename T, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessageInternal(
 | 
	
		
			
				|  |  | +      Arena* arena, Args&&... args) {
 | 
	
		
			
				|  |  |      static_assert(
 | 
	
		
			
				|  |  |          InternalHelper<T>::is_arena_constructable::value,
 | 
	
		
			
				|  |  |          "CreateMessage can only construct types that are ArenaConstructable");
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  |      if (arena == NULL) {
 | 
	
		
			
				|  |  | -      return new T;
 | 
	
		
			
				|  |  | +      return new T(nullptr, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      return arena->CreateMessageInternal<T>();
 | 
	
		
			
				|  |  | +      return arena->DoCreateMessage<T>(std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateInternal(::google::protobuf::Arena* arena) {
 | 
	
		
			
				|  |  | +  // This specialization for no arguments is necessary, because its behavior is
 | 
	
		
			
				|  |  | +  // slightly different.  When the arena pointer is nullptr, it calls T()
 | 
	
		
			
				|  |  | +  // instead of T(nullptr).
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMessageInternal(
 | 
	
		
			
				|  |  | +      Arena* arena) {
 | 
	
		
			
				|  |  | +    static_assert(
 | 
	
		
			
				|  |  | +        InternalHelper<T>::is_arena_constructable::value,
 | 
	
		
			
				|  |  | +        "CreateMessage can only construct types that are ArenaConstructable");
 | 
	
		
			
				|  |  |      if (arena == NULL) {
 | 
	
		
			
				|  |  |        return new T();
 | 
	
		
			
				|  |  |      } else {
 | 
	
		
			
				|  |  | -      return arena->CreateInternal<T>(google::protobuf::internal::has_trivial_destructor<T>::value);
 | 
	
		
			
				|  |  | +      return arena->DoCreateMessage<T>();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  template <typename T, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateInternal(
 | 
	
		
			
				|  |  | +      Arena* arena, Args&&... args) {
 | 
	
		
			
				|  |  | +    if (arena == NULL) {
 | 
	
		
			
				|  |  | +      return new T(std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      return arena->DoCreate<T>(std::is_trivially_destructible<T>::value,
 | 
	
		
			
				|  |  | +                                std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -696,8 +519,9 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // Allocate and also optionally call on_arena_allocation callback with the
 | 
	
		
			
				|  |  |    // allocated type info when the hooks are in place in ArenaOptions and
 | 
	
		
			
				|  |  |    // the cookie is not null.
 | 
	
		
			
				|  |  | -  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  void* AllocateInternal(bool skip_explicit_ownership) {
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void* AllocateInternal(
 | 
	
		
			
				|  |  | +      bool skip_explicit_ownership) {
 | 
	
		
			
				|  |  |      const size_t n = internal::AlignUpTo8(sizeof(T));
 | 
	
		
			
				|  |  |      AllocHook(RTTI_TYPE_ID(T), n);
 | 
	
		
			
				|  |  |      // Monitor allocation if needed.
 | 
	
	
		
			
				|  | @@ -714,27 +538,49 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // as it can cause confusing API usages, and end up having double free in
 | 
	
		
			
				|  |  |    // user code. These are used only internally from LazyField and Repeated
 | 
	
		
			
				|  |  |    // fields, since they are designed to work in all mode combinations.
 | 
	
		
			
				|  |  | -  template <typename Msg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static Msg* CreateMaybeMessage(Arena* arena, google::protobuf::internal::true_type) {
 | 
	
		
			
				|  |  | -    return CreateMessageInternal<Msg>(arena);
 | 
	
		
			
				|  |  | +  template <typename Msg, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static Msg* DoCreateMaybeMessage(
 | 
	
		
			
				|  |  | +      Arena* arena, std::true_type, Args&&... args) {
 | 
	
		
			
				|  |  | +    return CreateMessageInternal<Msg>(arena, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateMaybeMessage(Arena* arena, google::protobuf::internal::false_type) {
 | 
	
		
			
				|  |  | -    return CreateInternal<T>(arena);
 | 
	
		
			
				|  |  | +  template <typename T, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* DoCreateMaybeMessage(
 | 
	
		
			
				|  |  | +      Arena* arena, std::false_type, Args&&... args) {
 | 
	
		
			
				|  |  | +    return CreateInternal<T>(arena, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static T* CreateMaybeMessage(Arena* arena) {
 | 
	
		
			
				|  |  | -    return CreateMaybeMessage<T>(arena, is_arena_constructable<T>());
 | 
	
		
			
				|  |  | +  template <typename T, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateMaybeMessage(
 | 
	
		
			
				|  |  | +      Arena* arena, Args&&... args) {
 | 
	
		
			
				|  |  | +    return DoCreateMaybeMessage<T>(arena, is_arena_constructable<T>(),
 | 
	
		
			
				|  |  | +                                   std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  template <typename T, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateNoMessage(
 | 
	
		
			
				|  |  | +      Arena* arena, std::true_type, Args&&... args) {
 | 
	
		
			
				|  |  | +    // User is constructing with Create() despite the fact that T supports arena
 | 
	
		
			
				|  |  | +    // construction.  In this case we have to delegate to CreateInternal(), and
 | 
	
		
			
				|  |  | +    // we can't use any CreateMaybeMessage() specialization that may be defined.
 | 
	
		
			
				|  |  | +    return CreateInternal<T>(arena, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  template <typename T, typename... Args>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static T* CreateNoMessage(
 | 
	
		
			
				|  |  | +      Arena* arena, std::false_type, Args&&... args) {
 | 
	
		
			
				|  |  | +    // User is constructing with Create() and the type does not support arena
 | 
	
		
			
				|  |  | +    // construction.  In this case we can delegate to CreateMaybeMessage() and
 | 
	
		
			
				|  |  | +    // use any specialization that may be available for that.
 | 
	
		
			
				|  |  | +    return CreateMaybeMessage<T>(arena, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Just allocate the required size for the given type assuming the
 | 
	
		
			
				|  |  |    // type has a trivial constructor.
 | 
	
		
			
				|  |  | -  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternalRawArray(size_t num_elements) {
 | 
	
		
			
				|  |  | -    GOOGLE_CHECK_LE(num_elements,
 | 
	
		
			
				|  |  | -             std::numeric_limits<size_t>::max() / sizeof(T))
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateInternalRawArray(
 | 
	
		
			
				|  |  | +      size_t num_elements) {
 | 
	
		
			
				|  |  | +    GOOGLE_CHECK_LE(num_elements, std::numeric_limits<size_t>::max() / sizeof(T))
 | 
	
		
			
				|  |  |          << "Requested size is too large to fit into size_t.";
 | 
	
		
			
				|  |  |      const size_t n = internal::AlignUpTo8(sizeof(T) * num_elements);
 | 
	
		
			
				|  |  |      // Monitor allocation if needed.
 | 
	
	
		
			
				|  | @@ -742,143 +588,18 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |      return static_cast<T*>(impl_.AllocateAligned(n));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  |    template <typename T, typename... Args>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership, Args&&... args) {
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* DoCreate(
 | 
	
		
			
				|  |  | +      bool skip_explicit_ownership, Args&&... args) {
 | 
	
		
			
				|  |  |      return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  |          T(std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -#else
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership)) T();
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership, const Arg& arg) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership)) T(arg);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership)) T(arg1, arg2);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2,
 | 
	
		
			
				|  |  | -                    const Arg3& arg3) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  | -        T(arg1, arg2, arg3);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2,
 | 
	
		
			
				|  |  | -                    const Arg3& arg3,
 | 
	
		
			
				|  |  | -                    const Arg4& arg4) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  | -        T(arg1, arg2, arg3, arg4);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2,
 | 
	
		
			
				|  |  | -                    const Arg3& arg3,
 | 
	
		
			
				|  |  | -                    const Arg4& arg4,
 | 
	
		
			
				|  |  | -                    const Arg5& arg5) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  | -        T(arg1, arg2, arg3, arg4, arg5);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5, typename Arg6>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2,
 | 
	
		
			
				|  |  | -                    const Arg3& arg3,
 | 
	
		
			
				|  |  | -                    const Arg4& arg4,
 | 
	
		
			
				|  |  | -                    const Arg5& arg5,
 | 
	
		
			
				|  |  | -                    const Arg6& arg6) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  | -        T(arg1, arg2, arg3, arg4, arg5, arg6);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5, typename Arg6, typename Arg7>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2,
 | 
	
		
			
				|  |  | -                    const Arg3& arg3,
 | 
	
		
			
				|  |  | -                    const Arg4& arg4,
 | 
	
		
			
				|  |  | -                    const Arg5& arg5,
 | 
	
		
			
				|  |  | -                    const Arg6& arg6,
 | 
	
		
			
				|  |  | -                    const Arg7& arg7) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  | -        T(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2, typename Arg3,
 | 
	
		
			
				|  |  | -            typename Arg4, typename Arg5, typename Arg6, typename Arg7,
 | 
	
		
			
				|  |  | -            typename Arg8>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateInternal(bool skip_explicit_ownership,
 | 
	
		
			
				|  |  | -                    const Arg1& arg1,
 | 
	
		
			
				|  |  | -                    const Arg2& arg2,
 | 
	
		
			
				|  |  | -                    const Arg3& arg3,
 | 
	
		
			
				|  |  | -                    const Arg4& arg4,
 | 
	
		
			
				|  |  | -                    const Arg5& arg5,
 | 
	
		
			
				|  |  | -                    const Arg6& arg6,
 | 
	
		
			
				|  |  | -                    const Arg7& arg7,
 | 
	
		
			
				|  |  | -                    const Arg8& arg8) {
 | 
	
		
			
				|  |  | -    return new (AllocateInternal<T>(skip_explicit_ownership))
 | 
	
		
			
				|  |  | -        T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -#if LANG_CXX11
 | 
	
		
			
				|  |  |    template <typename T, typename... Args>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal(
 | 
	
		
			
				|  |  | -      Args&&... args) {
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* DoCreateMessage(Args&&... args) {
 | 
	
		
			
				|  |  |      return InternalHelper<T>::Construct(
 | 
	
		
			
				|  |  |          AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
 | 
	
		
			
				|  |  |          this, std::forward<Args>(args)...);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -#endif
 | 
	
		
			
				|  |  | -  template <typename T>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE T* CreateMessageInternal() {
 | 
	
		
			
				|  |  | -    return InternalHelper<T>::Construct(
 | 
	
		
			
				|  |  | -        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
 | 
	
		
			
				|  |  | -        this);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateMessageInternal(const Arg& arg) {
 | 
	
		
			
				|  |  | -    return InternalHelper<T>::Construct(
 | 
	
		
			
				|  |  | -        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
 | 
	
		
			
				|  |  | -        this, arg);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  template <typename T, typename Arg1, typename Arg2>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  T* CreateMessageInternal(const Arg1& arg1, const Arg2& arg2) {
 | 
	
		
			
				|  |  | -    return InternalHelper<T>::Construct(
 | 
	
		
			
				|  |  | -        AllocateInternal<T>(InternalHelper<T>::is_destructor_skippable::value),
 | 
	
		
			
				|  |  | -        this, arg1, arg2);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // CreateInArenaStorage is used to implement map field. Without it,
 | 
	
		
			
				|  |  |    // google::protobuf::Map need to call generated message's protected arena constructor,
 | 
	
	
		
			
				|  | @@ -893,22 +614,22 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    template <typename T>
 | 
	
		
			
				|  |  | -  static void CreateInArenaStorageInternal(
 | 
	
		
			
				|  |  | -      T* ptr, Arena* arena, google::protobuf::internal::true_type) {
 | 
	
		
			
				|  |  | +  static void CreateInArenaStorageInternal(T* ptr, Arena* arena,
 | 
	
		
			
				|  |  | +                                           std::true_type) {
 | 
	
		
			
				|  |  |      InternalHelper<T>::Construct(ptr, arena);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    template <typename T>
 | 
	
		
			
				|  |  | -  static void CreateInArenaStorageInternal(
 | 
	
		
			
				|  |  | -      T* ptr, Arena* /* arena */, google::protobuf::internal::false_type) {
 | 
	
		
			
				|  |  | +  static void CreateInArenaStorageInternal(T* ptr, Arena* /* arena */,
 | 
	
		
			
				|  |  | +                                           std::false_type) {
 | 
	
		
			
				|  |  |      new (ptr) T();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    template <typename T>
 | 
	
		
			
				|  |  | -  static void RegisterDestructorInternal(
 | 
	
		
			
				|  |  | -      T* /* ptr */, Arena* /* arena */, google::protobuf::internal::true_type) {}
 | 
	
		
			
				|  |  | +  static void RegisterDestructorInternal(T* /* ptr */, Arena* /* arena */,
 | 
	
		
			
				|  |  | +                                         std::true_type) {}
 | 
	
		
			
				|  |  |    template <typename T>
 | 
	
		
			
				|  |  | -  static void RegisterDestructorInternal(
 | 
	
		
			
				|  |  | -      T* ptr, Arena* arena, google::protobuf::internal::false_type) {
 | 
	
		
			
				|  |  | +  static void RegisterDestructorInternal(T* ptr, Arena* arena,
 | 
	
		
			
				|  |  | +                                         std::false_type) {
 | 
	
		
			
				|  |  |      arena->OwnDestructor(ptr);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -917,15 +638,16 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // is a subtype of ::google::protobuf::Message and 'false_type' otherwise. Collapsing
 | 
	
		
			
				|  |  |    // all template instantiations to one for generic Message reduces code size,
 | 
	
		
			
				|  |  |    // using the virtual destructor instead.
 | 
	
		
			
				|  |  | -  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  void OwnInternal(T* object, google::protobuf::internal::true_type) {
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void OwnInternal(T* object,
 | 
	
		
			
				|  |  | +                                                           std::true_type) {
 | 
	
		
			
				|  |  |      if (object != NULL) {
 | 
	
		
			
				|  |  | -      impl_.AddCleanup(object,
 | 
	
		
			
				|  |  | -                       &internal::arena_delete_object< ::google::protobuf::Message>);
 | 
	
		
			
				|  |  | +      impl_.AddCleanup(object, &internal::arena_delete_object<Message>);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  template<typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  void OwnInternal(T* object, google::protobuf::internal::false_type) {
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE void OwnInternal(T* object,
 | 
	
		
			
				|  |  | +                                                           std::false_type) {
 | 
	
		
			
				|  |  |      if (object != NULL) {
 | 
	
		
			
				|  |  |        impl_.AddCleanup(object, &internal::arena_delete_object<T>);
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -934,16 +656,15 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    // Implementation for GetArena(). Only message objects with
 | 
	
		
			
				|  |  |    // InternalArenaConstructable_ tags can be associated with an arena, and such
 | 
	
		
			
				|  |  |    // objects must implement a GetArenaNoVirtual() method.
 | 
	
		
			
				|  |  | -  template <typename T> GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static ::google::protobuf::Arena* GetArenaInternal(
 | 
	
		
			
				|  |  | -      const T* value, google::protobuf::internal::true_type) {
 | 
	
		
			
				|  |  | +  template <typename T>
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static Arena* GetArenaInternal(
 | 
	
		
			
				|  |  | +      const T* value, std::true_type) {
 | 
	
		
			
				|  |  |      return InternalHelper<T>::GetArena(value);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    template <typename T>
 | 
	
		
			
				|  |  | -  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE
 | 
	
		
			
				|  |  | -  static ::google::protobuf::Arena* GetArenaInternal(
 | 
	
		
			
				|  |  | -      const T* /* value */, google::protobuf::internal::false_type) {
 | 
	
		
			
				|  |  | +  GOOGLE_PROTOBUF_ATTRIBUTE_ALWAYS_INLINE static Arena* GetArenaInternal(
 | 
	
		
			
				|  |  | +      const T* /* value */, std::false_type) {
 | 
	
		
			
				|  |  |      return NULL;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -965,9 +686,10 @@ class LIBPROTOBUF_EXPORT Arena {
 | 
	
		
			
				|  |  |    void* hooks_cookie_;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    template <typename Type>
 | 
	
		
			
				|  |  | -  friend class ::google::protobuf::internal::GenericTypeHandler;
 | 
	
		
			
				|  |  | +  friend class internal::GenericTypeHandler;
 | 
	
		
			
				|  |  |    friend struct internal::ArenaStringPtr;  // For AllocateAligned.
 | 
	
		
			
				|  |  | -  friend class internal::LazyField;    // For CreateMaybeMessage.
 | 
	
		
			
				|  |  | +  friend class internal::LazyField;        // For CreateMaybeMessage.
 | 
	
		
			
				|  |  | +  friend class MessageLite;
 | 
	
		
			
				|  |  |    template <typename Key, typename T>
 | 
	
		
			
				|  |  |    friend class Map;
 | 
	
		
			
				|  |  |  };
 |