Move ptr_util to core/util. (#14647)
* Move ptr_util to core/util. Break the dependency of core onto XLA. * Reformat build file. * Fix the include directive.
This commit is contained in:
parent
b70aa4d554
commit
e37904e454
tensorflow
@ -175,6 +175,7 @@ cc_library(
|
||||
":types",
|
||||
":xla_data_proto",
|
||||
"//tensorflow/core:lib",
|
||||
"//tensorflow/core:ptr_util",
|
||||
],
|
||||
)
|
||||
|
||||
|
@ -16,7 +16,8 @@ limitations under the License.
|
||||
#ifndef TENSORFLOW_COMPILER_XLA_PTR_UTIL_H_
|
||||
#define TENSORFLOW_COMPILER_XLA_PTR_UTIL_H_
|
||||
|
||||
// Utility functions for pointers.
|
||||
// As this was moved to tensorflow/core/util, provide indirections here to
|
||||
// maintain current functionality of the library.
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
@ -24,55 +25,27 @@ limitations under the License.
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#include "tensorflow/core/util/ptr_util.h"
|
||||
|
||||
namespace xla {
|
||||
|
||||
namespace internal {
|
||||
|
||||
// Trait to select overloads and return types for MakeUnique.
|
||||
template <typename T>
|
||||
struct MakeUniqueResult {
|
||||
using scalar = std::unique_ptr<T>;
|
||||
};
|
||||
template <typename T>
|
||||
struct MakeUniqueResult<T[]> {
|
||||
using array = std::unique_ptr<T[]>;
|
||||
};
|
||||
template <typename T, size_t N>
|
||||
struct MakeUniqueResult<T[N]> {
|
||||
using invalid = void;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// Transfers ownership of a raw pointer to a std::unique_ptr of deduced type.
|
||||
// Example:
|
||||
// X* NewX(int, int);
|
||||
// auto x = WrapUnique(NewX(1, 2)); // 'x' is std::unique_ptr<X>.
|
||||
//
|
||||
// WrapUnique is useful for capturing the output of a raw pointer factory.
|
||||
// However, prefer 'MakeUnique<T>(args...) over 'WrapUnique(new T(args...))'.
|
||||
// auto x = WrapUnique(new X(1, 2)); // works, but nonideal.
|
||||
// auto x = MakeUnique<X>(1, 2); // safer, standard, avoids raw 'new'.
|
||||
//
|
||||
// Note: Cannot wrap pointers to array of unknown bound (i.e. U(*)[]).
|
||||
template <typename T>
|
||||
std::unique_ptr<T> WrapUnique(T* ptr) {
|
||||
static_assert(!std::is_array<T>::value || std::extent<T>::value != 0,
|
||||
"types T[0] or T[] are unsupported");
|
||||
return std::unique_ptr<T>(ptr);
|
||||
return tensorflow::WrapUnique<T>(ptr);
|
||||
}
|
||||
|
||||
template <typename T, typename... Args>
|
||||
typename internal::MakeUniqueResult<T>::scalar MakeUnique(Args&&... args) {
|
||||
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
||||
typename tensorflow::helper::MakeUniqueResult<T>::scalar MakeUnique(
|
||||
Args&&... args) {
|
||||
return tensorflow::MakeUnique<T, Args>(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
// Overload for array of unknown bound.
|
||||
// The allocation of arrays needs to use the array form of new,
|
||||
// and cannot take element constructor arguments.
|
||||
template <typename T>
|
||||
typename internal::MakeUniqueResult<T>::array MakeUnique(size_t n) {
|
||||
return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]());
|
||||
typename tensorflow::helper::MakeUniqueResult<T>::array MakeUnique(size_t n) {
|
||||
return tensorflow::MakeUnique<T>(n);
|
||||
}
|
||||
|
||||
} // namespace xla
|
||||
|
@ -455,6 +455,7 @@ tf_cuda_library(
|
||||
"util/mirror_pad_mode.h",
|
||||
"util/padding.h",
|
||||
"util/port.h",
|
||||
"util/ptr_util.h",
|
||||
"util/reffed_status_callback.h",
|
||||
"util/saved_tensor_slice_util.h",
|
||||
"util/sparse/group_iterator.h",
|
||||
@ -493,6 +494,11 @@ cc_library(
|
||||
],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "ptr_util",
|
||||
hdrs = ["util/ptr_util.h"],
|
||||
)
|
||||
|
||||
cc_library(
|
||||
name = "reader_base",
|
||||
srcs = ["framework/reader_base.cc"],
|
||||
|
@ -6241,11 +6241,11 @@ cc_library(
|
||||
srcs = ["summary_interface.cc"],
|
||||
hdrs = ["summary_interface.h"],
|
||||
deps = [
|
||||
"//tensorflow/compiler/xla:util",
|
||||
"//tensorflow/core:framework",
|
||||
"//tensorflow/core:lib",
|
||||
"//tensorflow/core:lib_internal",
|
||||
"//tensorflow/core:protos_all_cc",
|
||||
"//tensorflow/core:ptr_util",
|
||||
],
|
||||
)
|
||||
|
||||
|
@ -16,7 +16,6 @@ limitations under the License.
|
||||
|
||||
#include <utility>
|
||||
|
||||
#include "tensorflow/compiler/xla/ptr_util.h"
|
||||
#include "tensorflow/core/framework/graph.pb.h"
|
||||
#include "tensorflow/core/framework/op_kernel.h"
|
||||
#include "tensorflow/core/framework/resource_mgr.h"
|
||||
@ -28,6 +27,7 @@ limitations under the License.
|
||||
#include "tensorflow/core/lib/png/png_io.h"
|
||||
#include "tensorflow/core/lib/wav/wav_io.h"
|
||||
#include "tensorflow/core/util/events_writer.h"
|
||||
#include "tensorflow/core/util/ptr_util.h"
|
||||
|
||||
namespace tensorflow {
|
||||
namespace {
|
||||
@ -229,7 +229,7 @@ class SummaryWriterImpl : public SummaryWriterInterface {
|
||||
}
|
||||
mutex_lock ml(mu_);
|
||||
events_writer_ =
|
||||
xla::MakeUnique<EventsWriter>(io::JoinPath(logdir, "events"));
|
||||
tensorflow::MakeUnique<EventsWriter>(io::JoinPath(logdir, "events"));
|
||||
if (!events_writer_->InitWithSuffix(filename_suffix)) {
|
||||
return errors::Unknown("Could not initialize events writer.");
|
||||
}
|
||||
|
80
tensorflow/core/util/ptr_util.h
Normal file
80
tensorflow/core/util/ptr_util.h
Normal file
@ -0,0 +1,80 @@
|
||||
/* Copyright 2017 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_UTIL_PTR_UTIL_H_
|
||||
#define TENSORFLOW_CORE_UTIL_PTR_UTIL_H_
|
||||
|
||||
// Utility functions for pointers.
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include <memory>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
namespace tensorflow {
|
||||
|
||||
namespace helper {
|
||||
|
||||
// Trait to select overloads and return types for MakeUnique.
|
||||
template <typename T>
|
||||
struct MakeUniqueResult {
|
||||
using scalar = std::unique_ptr<T>;
|
||||
};
|
||||
template <typename T>
|
||||
struct MakeUniqueResult<T[]> {
|
||||
using array = std::unique_ptr<T[]>;
|
||||
};
|
||||
template <typename T, size_t N>
|
||||
struct MakeUniqueResult<T[N]> {
|
||||
using invalid = void;
|
||||
};
|
||||
|
||||
} // namespace helper
|
||||
|
||||
// Transfers ownership of a raw pointer to a std::unique_ptr of deduced type.
|
||||
// Example:
|
||||
// X* NewX(int, int);
|
||||
// auto x = WrapUnique(NewX(1, 2)); // 'x' is std::unique_ptr<X>.
|
||||
//
|
||||
// WrapUnique is useful for capturing the output of a raw pointer factory.
|
||||
// However, prefer 'MakeUnique<T>(args...) over 'WrapUnique(new T(args...))'.
|
||||
// auto x = WrapUnique(new X(1, 2)); // works, but nonideal.
|
||||
// auto x = MakeUnique<X>(1, 2); // safer, standard, avoids raw 'new'.
|
||||
//
|
||||
// Note: Cannot wrap pointers to array of unknown bound (i.e. U(*)[]).
|
||||
template <typename T>
|
||||
std::unique_ptr<T> WrapUnique(T* ptr) {
|
||||
static_assert(!std::is_array<T>::value || std::extent<T>::value != 0,
|
||||
"types T[0] or T[] are unsupported");
|
||||
return std::unique_ptr<T>(ptr);
|
||||
}
|
||||
|
||||
template <typename T, typename... Args>
|
||||
typename helper::MakeUniqueResult<T>::scalar MakeUnique(Args&&... args) {
|
||||
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
|
||||
}
|
||||
|
||||
// Overload for array of unknown bound.
|
||||
// The allocation of arrays needs to use the array form of new,
|
||||
// and cannot take element constructor arguments.
|
||||
template <typename T>
|
||||
typename helper::MakeUniqueResult<T>::array MakeUnique(size_t n) {
|
||||
return std::unique_ptr<T>(new typename std::remove_extent<T>::type[n]());
|
||||
}
|
||||
|
||||
} // namespace tensorflow
|
||||
|
||||
#endif // TENSORFLOW_CORE_UTIL_PTR_UTIL_H_
|
Loading…
Reference in New Issue
Block a user