From d2309fe5895ba431a4bb11e79564d12028cc93d5 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Wed, 23 May 2018 12:18:23 -0700 Subject: [PATCH] Introduce Encoder and Decoder classes so that platform/*coding* doesn't have to depend on framework/resource_handler and framework/variant. PiperOrigin-RevId: 197768387 --- tensorflow/contrib/cmake/tf_core_framework.cmake | 6 -- tensorflow/core/BUILD | 16 +--- tensorflow/core/framework/resource_handle.cc | 25 ++++++ tensorflow/core/framework/resource_handle.h | 9 +++ tensorflow/core/framework/tensor.cc | 13 +-- tensorflow/core/framework/variant.cc | 33 ++++++++ tensorflow/core/framework/variant_encode_decode.h | 10 +++ tensorflow/core/platform/default/build_config.bzl | 8 -- tensorflow/core/platform/default/string_coding.cc | 30 +++++++ tensorflow/core/platform/default/string_coding.h | 98 +++++++++++++++++++++++ tensorflow/core/platform/tensor_coding.cc | 36 +-------- tensorflow/core/platform/tensor_coding.h | 10 +-- tensorflow/core/platform/variant_coding.cc | 71 ---------------- tensorflow/core/platform/variant_coding.h | 40 --------- 14 files changed, 219 insertions(+), 186 deletions(-) create mode 100644 tensorflow/core/platform/default/string_coding.cc create mode 100644 tensorflow/core/platform/default/string_coding.h delete mode 100644 tensorflow/core/platform/variant_coding.cc delete mode 100644 tensorflow/core/platform/variant_coding.h diff --git a/tensorflow/contrib/cmake/tf_core_framework.cmake b/tensorflow/contrib/cmake/tf_core_framework.cmake index b47c32f..dac84cc 100644 --- a/tensorflow/contrib/cmake/tf_core_framework.cmake +++ b/tensorflow/contrib/cmake/tf_core_framework.cmake @@ -213,10 +213,6 @@ else() list(REMOVE_ITEM tf_core_platform_srcs ${tf_core_platform_srcs_exclude}) endif() -file(GLOB tf_core_platform_exclude_srcs - "${tensorflow_source_dir}/tensorflow/core/platform/variant_coding.cc") -list(REMOVE_ITEM tf_core_platform_srcs ${tf_core_platform_exclude_srcs}) - list(APPEND tf_core_lib_srcs ${tf_core_platform_srcs}) if(UNIX) @@ -286,8 +282,6 @@ set(tf_version_srcs ${tensorflow_source_dir}/tensorflow/core/util/version_info.c file(GLOB_RECURSE tf_core_framework_srcs "${tensorflow_source_dir}/tensorflow/core/framework/*.h" "${tensorflow_source_dir}/tensorflow/core/framework/*.cc" - "${tensorflow_source_dir}/tensorflow/core/platform/variant_coding.h" - "${tensorflow_source_dir}/tensorflow/core/platform/variant_coding.cc" "${tensorflow_source_dir}/tensorflow/core/graph/edgeset.h" "${tensorflow_source_dir}/tensorflow/core/graph/edgeset.cc" "${tensorflow_source_dir}/tensorflow/core/graph/graph.h" diff --git a/tensorflow/core/BUILD b/tensorflow/core/BUILD index 9b32a6e..19e88d6 100644 --- a/tensorflow/core/BUILD +++ b/tensorflow/core/BUILD @@ -111,8 +111,6 @@ load( "tf_additional_lib_deps", "tf_additional_lib_hdrs", "tf_additional_lib_srcs", - "tf_additional_framework_hdrs", - "tf_additional_framework_srcs", "tf_additional_minimal_lib_srcs", "tf_additional_proto_hdrs", "tf_additional_proto_srcs", @@ -2003,8 +2001,6 @@ cc_library( "platform/**/device_tracer.cc", "platform/**/logging.cc", "platform/abi.cc", - "platform/variant_coding.cc", - "platform/**/variant_cord_coding.cc", ], ) + tf_additional_lib_srcs( exclude = [ @@ -2017,8 +2013,6 @@ cc_library( "platform/**/device_tracer.cc", "platform/**/logging.cc", "platform/abi.cc", - "platform/variant_coding.cc", - "platform/**/variant_cord_coding.cc", ] + # Protobuf deps already included through the ":lib_proto_parsing" # dependency. @@ -2268,7 +2262,6 @@ cc_library( ) FRAMEWORK_INTERNAL_PRIVATE_HEADERS = [ - "platform/variant_coding.h", "graph/edgeset.h", "graph/graph.h", "graph/graph_def_builder.h", @@ -2309,14 +2302,13 @@ FRAMEWORK_INTERNAL_PUBLIC_HEADERS = [ "framework/tracking_allocator.h", # only needed for tests "framework/unique_tensor_references.h", "framework/variant.h", - "platform/variant_coding.h", "util/command_line_flags.h", "util/env_var.h", "util/equal_graph_def.h", "util/presized_cuckoo_map.h", "util/tensor_slice_set.h", "util/tensor_slice_util.h", -] + tf_additional_framework_hdrs() +] tf_cuda_library( name = "framework_internal", @@ -2358,9 +2350,7 @@ cc_header_only_library( tf_cuda_library( name = "framework_internal_impl", - srcs = FRAMEWORK_INTERNAL_PRIVATE_HEADERS + [ - "platform/variant_coding.cc", - ] + glob( + srcs = FRAMEWORK_INTERNAL_PRIVATE_HEADERS + glob( [ "example/**/*.cc", "framework/**/*.cc", @@ -2394,7 +2384,7 @@ tf_cuda_library( "util/memmapped_file_system.cc", "util/memmapped_file_system_writer.cc", ], - }) + tf_additional_framework_srcs(), + }), hdrs = FRAMEWORK_INTERNAL_PUBLIC_HEADERS, copts = tf_copts(), linkopts = select({ diff --git a/tensorflow/core/framework/resource_handle.cc b/tensorflow/core/framework/resource_handle.cc index 39ef827..fc3a329 100644 --- a/tensorflow/core/framework/resource_handle.cc +++ b/tensorflow/core/framework/resource_handle.cc @@ -66,4 +66,29 @@ string ProtoDebugString(const ResourceHandle& handle) { return handle.DebugString(); } +void EncodeResourceHandleList(const ResourceHandle* p, int64 n, + std::unique_ptr e) { + ResourceHandleProto proto; + for (int i = 0; i < n; ++i) { + p[i].AsProto(&proto); + e->Append(proto); + } + e->Finalize(); +} + +bool DecodeResourceHandleList(std::unique_ptr d, + ResourceHandle* ps, int64 n) { + std::vector sizes(n); + if (!d->ReadSizes(&sizes)) return false; + + ResourceHandleProto proto; + for (int i = 0; i < n; ++i) { + if (!proto.ParseFromArray(d->Data(sizes[i]), sizes[i])) { + return false; + } + ps[i].FromProto(proto); + } + return true; +} + } // namespace tensorflow diff --git a/tensorflow/core/framework/resource_handle.h b/tensorflow/core/framework/resource_handle.h index 06df1b9..db21366 100644 --- a/tensorflow/core/framework/resource_handle.h +++ b/tensorflow/core/framework/resource_handle.h @@ -16,6 +16,7 @@ limitations under the License. #ifndef TENSORFLOW_FRAMEWORK_RESOURCE_HANDLE_H_ #define TENSORFLOW_FRAMEWORK_RESOURCE_HANDLE_H_ +#include "tensorflow/core/platform/tensor_coding.h" #include "tensorflow/core/platform/types.h" namespace tensorflow { @@ -77,6 +78,14 @@ class ResourceHandle { // For backwards compatibility for when this was a proto string ProtoDebugString(const ResourceHandle& handle); +// Encodes a list of ResourceHandle protos in the given StringListEncoder. +void EncodeResourceHandleList(const ResourceHandle* p, int64 n, + std::unique_ptr e); + +// Decodes a list of ResourceHandle protos from the given StringListDecoder. +bool DecodeResourceHandleList(std::unique_ptr d, + ResourceHandle* ps, int64 n); + } // namespace tensorflow #endif // TENSORFLOW_FRAMEWORK_RESOURCE_HANDLE_H_ diff --git a/tensorflow/core/framework/tensor.cc b/tensorflow/core/framework/tensor.cc index 167e0ea..384a42f 100644 --- a/tensorflow/core/framework/tensor.cc +++ b/tensorflow/core/framework/tensor.cc @@ -51,7 +51,6 @@ limitations under the License. #include "tensorflow/core/platform/protobuf.h" #include "tensorflow/core/platform/tensor_coding.h" #include "tensorflow/core/platform/types.h" -#include "tensorflow/core/platform/variant_coding.h" namespace tensorflow { @@ -207,7 +206,8 @@ struct Helper { // "out", which is usually the TensorProto::tensor_content. template static void Encode(TensorBuffer* in, int64 n, Destination* out) { - port::EncodeResourceHandleList(in->base(), n, out); + EncodeResourceHandleList(in->base(), n, + port::NewStringListEncoder(out)); } // Decodes "n" elements of type string from "in" and constructs a @@ -217,7 +217,8 @@ struct Helper { static TensorBuffer* Decode(Allocator* a, const Source& in, int64 n) { auto* buf = new Buffer(a, n); ResourceHandle* ps = buf->template base(); - if (ps == nullptr || !port::DecodeResourceHandleList(in, ps, n)) { + if (ps == nullptr || + !DecodeResourceHandleList(port::NewStringListDecoder(in), ps, n)) { buf->Unref(); return nullptr; } @@ -237,7 +238,8 @@ struct Helper { // "out", which is usually the TensorProto::tensor_content. template static void Encode(TensorBuffer* in, int64 n, Destination* out) { - port::EncodeVariantList(in->base(), n, out); + EncodeVariantList(in->base(), n, + port::NewStringListEncoder(out)); } // Decodes "n" elements of type Variant from "in" and constructs a @@ -247,7 +249,8 @@ struct Helper { static TensorBuffer* Decode(Allocator* a, const Source& in, int64 n) { auto* buf = new Buffer(a, n); Variant* ps = buf->template base(); - if (ps == nullptr || !port::DecodeVariantList(in, ps, n)) { + if (ps == nullptr || + !DecodeVariantList(port::NewStringListDecoder(in), ps, n)) { buf->Unref(); return nullptr; } diff --git a/tensorflow/core/framework/variant.cc b/tensorflow/core/framework/variant.cc index 6ad2faf..5a50780 100644 --- a/tensorflow/core/framework/variant.cc +++ b/tensorflow/core/framework/variant.cc @@ -16,6 +16,7 @@ limitations under the License. #include "tensorflow/core/framework/variant.h" #include "tensorflow/core/framework/tensor.pb.h" #include "tensorflow/core/framework/variant_encode_decode.h" +#include "tensorflow/core/framework/variant_op_registry.h" #include "tensorflow/core/framework/variant_tensor_data.h" #include "tensorflow/core/lib/core/errors.h" #include "tensorflow/core/lib/gtl/map_util.h" @@ -73,4 +74,36 @@ bool DecodeVariant(const string& buf, VariantTensorDataProto* value) { return value->ParseFromString(buf); } +void EncodeVariantList(const Variant* variant_array, int64 n, + std::unique_ptr e) { + for (int i = 0; i < n; ++i) { + string s; + variant_array[i].Encode(&s); + e->Append(s); + } + e->Finalize(); +} + +bool DecodeVariantList(std::unique_ptr d, + Variant* variant_array, int64 n) { + std::vector sizes(n); + if (!d->ReadSizes(&sizes)) return false; + + for (int i = 0; i < n; ++i) { + if (variant_array[i].is_empty()) { + variant_array[i] = VariantTensorDataProto(); + } + string str(d->Data(sizes[i]), sizes[i]); + if (!variant_array[i].Decode(str)) return false; + if (!DecodeUnaryVariant(&variant_array[i])) { + LOG(ERROR) << "Could not decode variant with type_name: \"" + << variant_array[i].TypeName() + << "\". Perhaps you forgot to register a " + "decoder via REGISTER_UNARY_VARIANT_DECODE_FUNCTION?"; + return false; + } + } + return true; +} + } // end namespace tensorflow diff --git a/tensorflow/core/framework/variant_encode_decode.h b/tensorflow/core/framework/variant_encode_decode.h index 5a84f9d..ded04b2 100644 --- a/tensorflow/core/framework/variant_encode_decode.h +++ b/tensorflow/core/framework/variant_encode_decode.h @@ -259,6 +259,16 @@ void EncodeVariant(const VariantTensorDataProto& value, string* buf); template <> bool DecodeVariant(const string& buf, VariantTensorDataProto* value); +// Encodes an array of Variant objects in to the given StringListEncoder. +// `variant_array` is assumed to point to an array of `n` Variant objects. +void EncodeVariantList(const Variant* variant_array, int64 n, + std::unique_ptr e); + +// Decodes an array of Variant objects from the given StringListDecoder. +// `variant_array` is assumed to point to an array of `n` Variant objects. +bool DecodeVariantList(std::unique_ptr d, + Variant* variant_array, int64 n); + } // end namespace tensorflow #endif // TENSORFLOW_FRAMEWORK_VARIANT_ENCODE_DECODE_H_ diff --git a/tensorflow/core/platform/default/build_config.bzl b/tensorflow/core/platform/default/build_config.bzl index b4b756b..284581b 100644 --- a/tensorflow/core/platform/default/build_config.bzl +++ b/tensorflow/core/platform/default/build_config.bzl @@ -495,14 +495,6 @@ def tf_additional_lib_srcs(exclude = []): ], exclude = exclude), }) -# pylint: disable=unused-argument -def tf_additional_framework_hdrs(exclude = []): - return [] - -def tf_additional_framework_srcs(exclude = []): - return [] -# pylint: enable=unused-argument - def tf_additional_minimal_lib_srcs(): return [ "platform/default/integral_types.h", diff --git a/tensorflow/core/platform/default/string_coding.cc b/tensorflow/core/platform/default/string_coding.cc new file mode 100644 index 0000000..7410ee6 --- /dev/null +++ b/tensorflow/core/platform/default/string_coding.cc @@ -0,0 +1,30 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include "tensorflow/core/platform/default/string_coding.h" + +namespace tensorflow { +namespace port { + +std::unique_ptr NewStringListEncoder(string* out) { + return std::unique_ptr(new StringListEncoder(out)); +} + +std::unique_ptr NewStringListDecoder(const string& in) { + return std::unique_ptr(new StringListDecoder(in)); +} + +} // namespace port +} // namespace tensorflow diff --git a/tensorflow/core/platform/default/string_coding.h b/tensorflow/core/platform/default/string_coding.h new file mode 100644 index 0000000..70b8ab0 --- /dev/null +++ b/tensorflow/core/platform/default/string_coding.h @@ -0,0 +1,98 @@ +/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ +#ifndef TENSORFLOW_CORE_PLATFORM_DEFAULT_STRING_CODING_H_ +#define TENSORFLOW_CORE_PLATFORM_DEFAULT_STRING_CODING_H_ + +// IWYU pragma: private, include "third_party/tensorflow/core/platform/tensor_coding.h" +// IWYU pragma: friend third_party/tensorflow/core/platform/tensor_coding.h + +#include "tensorflow/core/lib/core/coding.h" +#include "tensorflow/core/lib/strings/strcat.h" +#include "tensorflow/core/platform/protobuf.h" +#include "tensorflow/core/platform/types.h" + +namespace tensorflow { +namespace port { + +// Encodes sequences of strings and serialized protocol buffers into a string. +// Normal usage consists of zero or more calls to Append() and a single call to +// Finalize(). +class StringListEncoder { + public: + explicit StringListEncoder(string* out) : out_(out) {} + + // Encodes the given protocol buffer. This may not be called after Finalize(). + void Append(const protobuf::MessageLite& m) { + core::PutVarint32(out_, m.ByteSize()); + m.AppendToString(&rest_); + } + + // Encodes the given string. This may not be called after Finalize(). + void Append(const string& s) { + core::PutVarint32(out_, s.length()); + strings::StrAppend(&rest_, s); + } + + // Signals end of the encoding process. No other calls are allowed after this. + void Finalize() { strings::StrAppend(out_, rest_); } + + private: + string* out_; + string rest_; +}; + +// Decodes a string into sequences of strings (which may represent serialized +// protocol buffers). Normal usage involves a single call to ReadSizes() in +// order to retrieve the length of all the strings in the sequence. For each +// size returned a call to Data() is expected and will return the actual +// string. +class StringListDecoder { + public: + explicit StringListDecoder(const string& in) : reader_(in) {} + + // Populates the given vector with the lengths of each string in the sequence + // being decoded. Upon returning the vector is guaranteed to contain as many + // elements as there are strings in the sequence. + bool ReadSizes(std::vector* sizes) { + int64 total = 0; + for (auto& size : *sizes) { + if (!core::GetVarint32(&reader_, &size)) return false; + total += size; + } + if (total != static_cast(reader_.size())) { + return false; + } + return true; + } + + // Returns a pointer to the next string in the sequence, then prepares for the + // next call by advancing 'size' characters in the sequence. + const char* Data(uint32 size) { + const char* data = reader_.data(); + reader_.remove_prefix(size); + return data; + } + + private: + StringPiece reader_; +}; + +std::unique_ptr NewStringListEncoder(string* out); +std::unique_ptr NewStringListDecoder(const string& in); + +} // namespace port +} // namespace tensorflow + +#endif // TENSORFLOW_CORE_PLATFORM_DEFAULT_STRING_CODING_H_ diff --git a/tensorflow/core/platform/tensor_coding.cc b/tensorflow/core/platform/tensor_coding.cc index 17dc81f..84601de 100644 --- a/tensorflow/core/platform/tensor_coding.cc +++ b/tensorflow/core/platform/tensor_coding.cc @@ -16,7 +16,7 @@ limitations under the License. #include "tensorflow/core/platform/tensor_coding.h" #include -#include "tensorflow/core/framework/resource_handle.pb.h" + #include "tensorflow/core/lib/core/coding.h" #include "tensorflow/core/lib/core/stringpiece.h" @@ -66,39 +66,5 @@ void CopyFromArray(string* s, const char* base, size_t bytes) { s->assign(base, bytes); } -void EncodeResourceHandleList(const ResourceHandle* p, int64 n, string* out) { - out->clear(); - string rest; - ResourceHandleProto proto; - for (int i = 0; i < n; ++i) { - p[i].AsProto(&proto); - core::PutVarint32(out, proto.ByteSize()); - proto.AppendToString(&rest); - } - *out += rest; -} - -bool DecodeResourceHandleList(const string& in, ResourceHandle* ps, int64 n) { - std::vector sizes(n); - StringPiece reader(in); - int64 total = 0; - for (auto& size : sizes) { - if (!core::GetVarint32(&reader, &size)) return false; - total += size; - } - if (total != static_cast(reader.size())) { - return false; - } - ResourceHandleProto proto; - for (int i = 0; i < n; ++i) { - if (!proto.ParseFromArray(reader.data(), sizes[i])) { - return false; - } - ps[i].FromProto(proto); - reader.remove_prefix(sizes[i]); - } - return true; -} - } // namespace port } // namespace tensorflow diff --git a/tensorflow/core/platform/tensor_coding.h b/tensorflow/core/platform/tensor_coding.h index 19f53e6..6c6d758 100644 --- a/tensorflow/core/platform/tensor_coding.h +++ b/tensorflow/core/platform/tensor_coding.h @@ -18,7 +18,6 @@ limitations under the License. #define TENSORFLOW_PLATFORM_TENSOR_CODING_H_ #include -#include "tensorflow/core/framework/resource_handle.h" #include "tensorflow/core/lib/core/refcount.h" #include "tensorflow/core/lib/core/stringpiece.h" #include "tensorflow/core/platform/platform.h" @@ -26,6 +25,8 @@ limitations under the License. #ifdef PLATFORM_GOOGLE #include "tensorflow/core/platform/google/cord_coding.h" +#else +#include "tensorflow/core/platform/default/string_coding.h" #endif namespace tensorflow { @@ -51,13 +52,6 @@ bool DecodeStringList(const string& src, string* strings, int64 n); // Assigns base[0..bytes-1] to *s void CopyFromArray(string* s, const char* base, size_t bytes); -// Encodes a list of ResourceHandle protos in the given string. -void EncodeResourceHandleList(const ResourceHandle* handles, int64 n, - string* out); - -// Decodes a list of ResourceHandle protos from the given string. -bool DecodeResourceHandleList(const string& in, ResourceHandle* ps, int64 n); - } // namespace port } // namespace tensorflow diff --git a/tensorflow/core/platform/variant_coding.cc b/tensorflow/core/platform/variant_coding.cc deleted file mode 100644 index 48c5389..0000000 --- a/tensorflow/core/platform/variant_coding.cc +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#include "tensorflow/core/platform/variant_coding.h" - -#include -#include "tensorflow/core/framework/tensor.pb.h" -#include "tensorflow/core/framework/variant_op_registry.h" -#include "tensorflow/core/lib/core/coding.h" -#include "tensorflow/core/lib/core/stringpiece.h" -#include "tensorflow/core/lib/strings/strcat.h" - -namespace tensorflow { -namespace port { - -void EncodeVariantList(const Variant* variant_array, int64 n, string* out) { - out->clear(); - string rest; - for (int i = 0; i < n; ++i) { - string s; - variant_array[i].Encode(&s); - core::PutVarint32(out, s.length()); - strings::StrAppend(&rest, s); - } - strings::StrAppend(out, rest); -} - -bool DecodeVariantList(const string& in, Variant* variant_array, int64 n) { - std::vector sizes(n); - StringPiece reader(in); - int64 total = 0; - for (auto& size : sizes) { - if (!core::GetVarint32(&reader, &size)) return false; - total += size; - } - if (total != static_cast(reader.size())) { - return false; - } - - for (int i = 0; i < n; ++i) { - if (variant_array[i].is_empty()) { - variant_array[i] = VariantTensorDataProto(); - } - string str(reader.data(), sizes[i]); - if (!variant_array[i].Decode(str)) return false; - if (!DecodeUnaryVariant(&variant_array[i])) { - LOG(ERROR) << "Could not decode variant with type_name: \"" - << variant_array[i].TypeName() - << "\". Perhaps you forgot to register a " - "decoder via REGISTER_UNARY_VARIANT_DECODE_FUNCTION?"; - return false; - } - reader.remove_prefix(sizes[i]); - } - return true; -} - -} // end namespace port -} // end namespace tensorflow diff --git a/tensorflow/core/platform/variant_coding.h b/tensorflow/core/platform/variant_coding.h deleted file mode 100644 index a971857..0000000 --- a/tensorflow/core/platform/variant_coding.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_PLATFORM_VARIANT_CODING_H_ -#define TENSORFLOW_PLATFORM_VARIANT_CODING_H_ - -#include "tensorflow/core/framework/variant.h" -#include "tensorflow/core/framework/variant_encode_decode.h" - -#ifdef PLATFORM_GOOGLE -#include "tensorflow/core/platform/google/variant_cord_coding.h" -#endif - -namespace tensorflow { -namespace port { - -// Encodes an array of Variant objects in to the given string. -// `variant_array` is assumed to point to an array of `n` Variant objects. -void EncodeVariantList(const Variant* variant_array, int64 n, string* out); - -// Decodes an array of Variant objects from the given string. -// `variant_array` is assumed to point to an array of `n` Variant objects. -bool DecodeVariantList(const string& in, Variant* variant_array, int64 n); - -} // end namespace port -} // end namespace tensorflow - -#endif // TENSORFLOW_PLATFORM_VARIANT_CODING_H_ -- 2.7.4