// Copyright 2017 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_RECYCLER_H_
#define FBL_RECYCLER_H_

#include <zircon/assert.h>

#include <type_traits>

// fbl::Recyclable<T>
//
// Notes:
//
// fbl::Recyclable<T> is a mix-in class which allows users to control what
// happens to objects when they reach the end of their lifecycle, as determined
// by the fbl managed pointer classes.
//
// The general idea is as follows.  A developer might have some sort of
// factory pattern where they hand out either unique_ptr<>s or RefPtr<>s
// to objects which they have created.  When their user is done with the
// object and the managed pointers let go of it, instead of executing the
// destructor and deleting the object, the developer may want to
// "recycle" the object and use it for some internal purpose.  Examples
// include...
//
// 1) Putting the object on some sort of internal list to hand out again
//    of the object is re-usable and the cost of construction/destruction
//    is high.
// 2) Putting the object into some form of deferred destruction queue
//    because users are either too high priority to pay the cost of
//    destruction when the object is released, or because the act of
//    destruction might involve operations which are not permitted when
//    the object is released (perhaps the object is released at IRQ time,
//    but the system needs to be running in a thread in order to properly
//    clean up the object)
// 3) Re-using the object internally for something like bookkeeping
//    purposes.
//
// In order to make use of the feature, users need to do two things.
//
// 1) Derive from fbl::Recyclable<T>.
// 2) Implement a method with the signature "void fbl_recycle()"
//
// When deriving from Recyclable<T>, T should be devoid of cv-qualifiers (even if
// the managed pointers handed out by the user's code are const or volatile).
// In addition, fbl_recycle must be visible to fbl::Recyclable<T>, either
// because it is public or because the T is friends with fbl::Recyclable<T>.
//
// :: Example ::
//
// Some code hands out unique pointers to const Foo objects and wishes to
// have the chance to recycle them.  The code would look something like
// this...
//
// class Foo : public fbl::Recyclable<Foo> {
// public:
//   // public implementation here
// private:
//   friend class fbl::Recyclable<Foo>;
//   void fbl_recycle() {
//     if (should_recycle())) {
//       do_recycle_stuff();
//     } else {
//       delete this;
//     }
//   }
// };
//
// Note: the intention is to use this feature with managed pointers,
// which will automatically detect and call the recycle method if
// present.  That said, there is nothing to stop users for manually
// calling fbl_recycle, provided that it is visible to the code which
// needs to call it.

namespace fbl {

// Default implementation of fbl::Recyclable.
//
// Note: we provide a default implementation instead of just a fwd declaration
// so we can add a static_assert which will give a user a more human readable
// error in case they make the mistake of deriving from fbl::Recyclable<const Foo>
// instead of fbl::Recyclable<Foo>
template <typename T, typename = void>
class Recyclable {
    // Note: static assert must depend on T in order to trigger only when the template gets
    // expanded.  If it does not depend on any template parameters, eg static_assert(false), then it
    // will always explode, regardless of whether or not the template is ever expanded.
    static_assert(std::is_same_v<T, T> == false,
                  "fbl::Recyclable<T> objects must not specify cv-qualifiers for T.  "
                  "IOW - derive from fbl::Recyclable<Foo>, not fbl::Recyclable<const Foo>");
};

namespace internal {

// Test to see if an object is recyclable.  An object of type T is considered to
// be recyclable if it derives from fbl::Recyclable<T>
template <typename T>
inline constexpr bool has_fbl_recycle_v =
                std::is_base_of_v<::fbl::Recyclable<std::remove_cv_t<T>>, T>;

// internal::recycler is the internal helper class which is permitted to call
// Recyclable<T>::fbl_recycle_thunk.  It can be removed when we move to C++17
// and have the ability to prune code paths using if-constexpr before they need
// to undergo name lookup or template expansion.
template <typename T, typename = void>
struct recycler {
    static inline void recycle(T* ptr) { ZX_ASSERT(false); }
};

template <typename T>
struct recycler<T, std::enable_if_t<has_fbl_recycle_v<T> == true>> {
    static inline void recycle(T* ptr) {
        Recyclable<std::remove_cv_t<T>>::fbl_recycle_thunk(
                const_cast<std::remove_cv_t<T>*>(ptr));
    }
};

}  // namespace internal

template <typename T>
class Recyclable<T,
                 std::enable_if_t<std::is_same_v<std::remove_cv_t<T>, T>>> {
private:
    // Recyclable is friends with all cv-forms of the internal::recycler.  This
    // way, managed pointer types can say internal::recycler<T>::recycle(ptr)
    // without needing to worry if T is const, volatile, or both.
    friend struct ::fbl::internal::recycler<T>;
    friend struct ::fbl::internal::recycler<const T>;
    friend struct ::fbl::internal::recycler<volatile T>;
    friend struct ::fbl::internal::recycler<const volatile T>;

    static void fbl_recycle_thunk(T* ptr) {
        static_assert(std::is_same_v<decltype(&T::fbl_recycle), void (T::*)(void)>,
                      "fbl_recycle() methods must be non-static member "
                      "functions with the signature 'void fbl_recycle()', and "
                      "be visible to fbl::Recyclable<T> (either because they are "
                      " public, or because of friendship).");
        ptr->fbl_recycle();
    }
};

}  // namespace fbl

#endif  // FBL_RECYCLER_H_
