blob: 2454856570db382d9e5989655be56700ea54fd77 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FBL_INTRUSIVE_POINTER_TRAITS_H_
#define FBL_INTRUSIVE_POINTER_TRAITS_H_
#include <stdint.h>
#include <zircon/compiler.h>
#include <memory>
#include <fbl/ref_ptr.h>
namespace fbl {
namespace internal {
// Declaration of the base type which will be used to control what type of
// pointers are permitted to be in containers.
template <typename T>
struct ContainerPtrTraits;
// Traits for managing raw pointers.
template <typename T>
struct ContainerPtrTraits<T*> {
using ValueType = T;
using RefType = T&;
using ConstRefType = const T&;
using PtrType = T*;
using ConstPtrType = const T*;
using RawPtrType = T*;
using ConstRawPtrType = const T*;
static constexpr bool IsManaged = false;
static constexpr bool CanCopy = true;
static inline T* GetRaw(const PtrType& ptr) { return ptr; }
static inline T* Copy(const RawPtrType& ptr) { return ptr; }
static inline RawPtrType Leak(PtrType& ptr) __WARN_UNUSED_RESULT { return ptr; }
static inline PtrType Reclaim(RawPtrType ptr) { return ptr; }
};
// Traits for managing std::unique_ptrs to objects (arrays of objects are not supported)
template <typename T, typename Deleter>
struct ContainerPtrTraits<::std::unique_ptr<T, Deleter>> {
using ValueType = T;
using RefType = T&;
using ConstRefType = const T&;
using PtrType = ::std::unique_ptr<T, Deleter>;
using ConstPtrType = ::std::unique_ptr<const T, Deleter>;
using RawPtrType = T*;
using ConstRawPtrType = const T*;
static constexpr bool IsManaged = true;
static constexpr bool CanCopy = false;
static inline T* GetRaw(const PtrType& ptr) { return ptr.get(); }
static inline RawPtrType Leak(PtrType& ptr) __WARN_UNUSED_RESULT { return ptr.release(); }
static inline PtrType Reclaim(RawPtrType ptr) { return PtrType(ptr); }
};
// Traits for managing ref_counted pointers.
template <typename T>
struct ContainerPtrTraits<::fbl::RefPtr<T>> {
using ValueType = T;
using RefType = T&;
using ConstRefType = const T&;
using PtrType = ::fbl::RefPtr<T>;
using ConstPtrType = ::fbl::RefPtr<const T>;
using RawPtrType = T*;
using ConstRawPtrType = const T*;
static constexpr bool IsManaged = true;
static constexpr bool CanCopy = true;
static inline T* GetRaw(const PtrType& ptr) { return ptr.get(); }
static inline PtrType Copy(const RawPtrType& ptr) { return PtrType(ptr); }
static inline RawPtrType Leak(PtrType& ptr) __WARN_UNUSED_RESULT {
return fbl::ExportToRawPtr(&ptr);
}
static inline PtrType Reclaim(RawPtrType ptr) { return ::fbl::ImportFromRawPtr(ptr); }
};
} // namespace internal
} // namespace fbl
#endif // FBL_INTRUSIVE_POINTER_TRAITS_H_