//*************************************************************************
//
//  Layered_EntangledList (EntangledChain Algorithm) - C++ language
//
//  Layered_EntangledList.h
//
//  Invented and developed by Armando Giuseppe BONATTO MINELLA.
//
//*************************************************************************
//
// IMPORTANT: The EntangledChain algorithm and its implementations,
//            EntangledList and EntangledTensor, are an industrial
//            secret owned by the authors.
//            For this reason, this file contains only functions
//            that return default (or null) values, solely for
//            illustrative purposes.
//
//*************************************************************************

//*************************************************************************
#ifndef LAYERED_ENTANGLEDLIST_H
  #define LAYERED_ENTANGLEDLIST_H
//*************************************************************************

//*************************************************************************
#include <cstdint>
#include <cstdlib>
//*************************************************************************

//*************************************************************************
template <typename T> struct Layered_EntangledList_Alpha_Lone {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Alpha_Page
{
  struct NODE
  {
    // Header layer #1
    // Header base
    T payload;
    //-------------------------------------------------------------------------
    inline                 NODE      (const T &) {}
    inline                 ~NODE     ()          {}
    inline NODE          * Next      (void)      { return (nullptr); }
    inline std::uint64_t   BaseIndex (void)      { return (UINT64_MAX); }
    inline std::uint64_t   TypeIndex (void)      { return (UINT64_MAX); }
  };
  //-------------------------------------------------------------------------
  struct TYPE
  {
    std::uint64_t count;
    //-------------------------------------------------------------------------
    inline TYPE  () {}
    inline ~TYPE () {}
  };
  //-------------------------------------------------------------------------
  std::uint64_t count = 0ull;
  //-------------------------------------------------------------------------
  inline        Layered_EntangledList_Alpha_Page  ()                       {}
  inline        ~Layered_EntangledList_Alpha_Page ()                       {}
  inline NODE * First                             (void)                   { return (nullptr); }
  inline NODE * At                                (const std::uint64_t &)  { return (nullptr); }
  inline NODE * At                                (const std::uint64_t &,
                                                   const TYPE          & ) { return (nullptr); }
  inline void   Append                            (const T    &,
                                                         TYPE & )          {}
  inline void   InsertAt                          (const std::uint64_t &,
                                                   const T             &,
                                                         TYPE          & ) {}
  inline void   RemoveAt                          (const std::uint64_t &,
                                                         TYPE          & ) {}
};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Alpha_Thin {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Alpha_Wall {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Omega_Lone {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Omega_Page {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Omega_Thin {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Omega_Wall {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Sigma_Lone {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Sigma_Page {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Sigma_Thin {};
//*************************************************************************
template <typename T> struct Layered_EntangledList_Sigma_Wall {};
//*************************************************************************

//*************************************************************************
#endif // LAYERED_ENTANGLEDLIST_H
//*************************************************************************

