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#include <google/protobuf/inlined_string_field.h>
32
33#include <google/protobuf/arena.h>
34#include <google/protobuf/arenastring.h>
35#include <google/protobuf/generated_message_util.h>
36#include <google/protobuf/message_lite.h>
37#include <google/protobuf/parse_context.h>
38
39// clang-format off
40#include <google/protobuf/port_def.inc>
41// clang-format on
42
43namespace google {
44namespace protobuf {
45namespace internal {
46
47
48std::string* InlinedStringField::Mutable(const LazyString& /*default_value*/,
49 Arena* arena, bool donated,
50 uint32_t* donating_states,
51 uint32_t mask, MessageLite* msg) {
52 if (arena == nullptr || !donated) {
53 return UnsafeMutablePointer();
54 }
55 return MutableSlow(arena, donated, donating_states, mask, msg);
56}
57
58std::string* InlinedStringField::Mutable(Arena* arena, bool donated,
59 uint32_t* donating_states,
60 uint32_t mask, MessageLite* msg) {
61 if (arena == nullptr || !donated) {
62 return UnsafeMutablePointer();
63 }
64 return MutableSlow(arena, donated, donating_states, mask, msg);
65}
66
67std::string* InlinedStringField::MutableSlow(::google::protobuf::Arena* arena,
68 bool donated,
69 uint32_t* donating_states,
70 uint32_t mask, MessageLite* msg) {
71 (void)mask;
72 (void)msg;
73 return UnsafeMutablePointer();
74}
75
76void InlinedStringField::SetAllocated(const std::string* default_value,
77 std::string* value, Arena* arena,
78 bool donated, uint32_t* donating_states,
79 uint32_t mask, MessageLite* msg) {
80 (void)mask;
81 (void)msg;
82 SetAllocatedNoArena(default_value, value);
83}
84
85void InlinedStringField::Set(std::string&& value, Arena* arena, bool donated,
86 uint32_t* donating_states, uint32_t mask,
87 MessageLite* msg) {
88 (void)donating_states;
89 (void)mask;
90 (void)msg;
91 SetNoArena(std::move(value));
92}
93
94std::string* InlinedStringField::Release() {
95 auto* released = new std::string(std::move(*get_mutable()));
96 get_mutable()->clear();
97 return released;
98}
99
100std::string* InlinedStringField::Release(Arena* arena, bool donated) {
101 // We can not steal donated arena strings.
102 std::string* released = (arena != nullptr && donated)
103 ? new std::string(*get_mutable())
104 : new std::string(std::move(*get_mutable()));
105 get_mutable()->clear();
106 return released;
107}
108
109void InlinedStringField::ClearToDefault(const LazyString& default_value,
110 Arena* arena, bool donated) {
111 (void)arena;
112 get_mutable()->assign(str: default_value.get());
113}
114
115
116} // namespace internal
117} // namespace protobuf
118} // namespace google
119