Move ptr_util to core/util. ()

* 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:
Gunhan Gulsoy 2017-11-17 10:34:06 -08:00 committed by Jonathan Hseu
parent b70aa4d554
commit e37904e454
6 changed files with 100 additions and 40 deletions
tensorflow

View File

@ -175,6 +175,7 @@ cc_library(
":types",
":xla_data_proto",
"//tensorflow/core:lib",
"//tensorflow/core:ptr_util",
],
)

View File

@ -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

View File

@ -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"],

View File

@ -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",
],
)

View File

@ -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.");
}

View 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_