16 #ifndef TENSORFLOW_SERVING_CORE_SERVABLE_HANDLE_H_
17 #define TENSORFLOW_SERVING_CORE_SERVABLE_HANDLE_H_
22 #include <type_traits>
24 #include "tensorflow_serving/core/loader.h"
25 #include "tensorflow_serving/util/any_ptr.h"
27 namespace tensorflow {
41 virtual AnyPtr servable() = 0;
77 static_assert(!std::is_pointer<T>::value,
78 "Servables are implicitly passed as pointers, please use T "
84 const ServableId& id()
const {
return untyped_handle_->id(); }
88 T& operator*()
const {
return *get(); }
90 T* operator->()
const {
return get(); }
92 T* get()
const {
return servable_; }
94 operator bool()
const {
return get() !=
nullptr; }
100 friend class Manager;
102 explicit ServableHandle(std::unique_ptr<UntypedServableHandle> untyped_handle)
103 : untyped_handle_(std::move(untyped_handle)),
104 servable_(untyped_handle_ == nullptr
106 : untyped_handle_->servable().get<T>()) {}
108 std::unique_ptr<UntypedServableHandle> untyped_handle_;
109 T* servable_ =
nullptr;
119 : id_(
id), loader_(std::move(loader)) {}
121 AnyPtr servable()
override {
return loader_->servable(); }
123 const ServableId& id()
const override {
return id_; }
127 std::shared_ptr<Loader> loader_;
133 template <
typename T,
typename U>
136 return l.get() == r.get() && l.id() == r.id();
139 template <
typename T,
typename U>
140 constexpr
bool operator!=(
const ServableHandle<T>& l,
141 const ServableHandle<U>& r) {
ServableHandle()=default
ServableHandle is null by default.