// Protocol Buffers - Google's data interchange format // Copyright 2008 Google Inc. All rights reserved. // https://developers.google.com/protocol-buffers/ // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef GOOGLE_PROTOBUF_INLINED_STRING_FIELD_H__ #define GOOGLE_PROTOBUF_INLINED_STRING_FIELD_H__ #include <string> #include <utility> #include <google/protobuf/stubs/logging.h> #include <google/protobuf/stubs/common.h> #include <google/protobuf/port.h> #include <google/protobuf/stubs/strutil.h> #include <google/protobuf/arenastring.h> #include <google/protobuf/message_lite.h> // Must be included last. #include <google/protobuf/port_def.inc> #ifdef SWIG #error "You cannot SWIG proto headers" #endif namespace google { namespace protobuf { class Arena; namespace internal { // InlinedStringField wraps a std::string instance and exposes an API similar to // ArenaStringPtr's wrapping of a std::string* instance. // // default_value parameters are taken for consistency with ArenaStringPtr, but // are not used for most methods. With inlining, these should be removed from // the generated binary. // // InlinedStringField has a donating mechanism that allows string buffer // allocated on arena. A string is donated means both the string container and // the data buffer are on arena. The donating mechanism here is similar to the // one in ArenaStringPtr with some differences: // // When an InlinedStringField is constructed, the donating state is true. This // is because the string container is directly stored in the message on the // arena: // // Construction: donated=true // Arena: // +-----------------------+ // |Message foo: | // | +-------------------+ | // | |InlinedStringField:| | // | | +-----+ | | // | | | | | | | | // | | +-----+ | | // | +-------------------+ | // +-----------------------+ // // When lvalue Set is called, the donating state is still true. String data will // be allocated on the arena: // // Lvalue Set: donated=true // Arena: // +-----------------------+ // |Message foo: | // | +-------------------+ | // | |InlinedStringField:| | // | | +-----+ | | // | | | | | | | | // | | +|----+ | | // | +--|----------------+ | // | V | // | +----------------+ | // | |'f','o','o',... | | // | +----------------+ | // +-----------------------+ // // Some operations will undonate a donated string, including: Mutable, // SetAllocated, Rvalue Set, and Swap with a non-donated string. // // For more details of the donating states transitions, go/pd-inlined-string. class PROTOBUF_EXPORT InlinedStringField { … }; inline std::string* InlinedStringField::get_mutable() { … } inline const std::string* InlinedStringField::get_const() const { … } inline InlinedStringField::InlinedStringField( const std::string& default_value) { … } inline InlinedStringField::InlinedStringField(Arena* /*arena*/) { … } inline const std::string& InlinedStringField::GetNoArena() const { … } inline void InlinedStringField::SetAllocatedNoArena( const std::string* /*default_value*/, std::string* value) { … } inline void InlinedStringField::DestroyNoArena(const std::string*) { … } inline void InlinedStringField::SetNoArena(StringPiece value) { … } inline void InlinedStringField::SetNoArena(std::string&& value) { … } // Caller should make sure rhs_arena allocated rhs, and lhs_arena allocated lhs. inline PROTOBUF_NDEBUG_INLINE void InlinedStringField::InternalSwap( InlinedStringField* lhs, Arena* lhs_arena, bool lhs_arena_dtor_registered, MessageLite* lhs_msg, // InlinedStringField* rhs, Arena* rhs_arena, bool rhs_arena_dtor_registered, MessageLite* rhs_msg) { … } inline void InlinedStringField::Set(ConstStringParam value, Arena* arena, bool donated, uint32_t* /*donating_states*/, uint32_t /*mask*/, MessageLite* /*msg*/) { … } inline void InlinedStringField::Set(const char* str, ::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } inline void InlinedStringField::Set(const char* str, size_t size, ::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } inline void InlinedStringField::SetBytes(ConstStringParam value, Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } inline void InlinedStringField::SetBytes(std::string&& value, Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } inline void InlinedStringField::SetBytes(const char* str, ::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } inline void InlinedStringField::SetBytes(const void* p, size_t size, ::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } template <typename RefWrappedType> inline void InlinedStringField::Set( std::reference_wrapper<RefWrappedType> const_string_ref, ::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } template <typename RefWrappedType> inline void InlinedStringField::SetBytes( std::reference_wrapper<RefWrappedType> const_string_ref, ::google::protobuf::Arena* arena, bool donated, uint32_t* donating_states, uint32_t mask, MessageLite* msg) { … } inline std::string* InlinedStringField::UnsafeMutablePointer() { … } inline std::string* InlinedStringField::Mutable(std::nullptr_t) { … } inline std::string* InlinedStringField::MutableNoCopy(std::nullptr_t) { … } } // namespace internal } // namespace protobuf } // namespace google #include <google/protobuf/port_undef.inc> #endif // GOOGLE_PROTOBUF_INLINED_STRING_FIELD_H__