90 lines
1.4 KiB
C++
Executable File
90 lines
1.4 KiB
C++
Executable File
// License: Modified MIT (NON-AI)
|
|
// See the LICENSE file in the root directory for license information.
|
|
// Copyright 2026 Timothy Prepscius
|
|
|
|
#pragma once
|
|
|
|
#include "Futures.h"
|
|
#include "Future.hpp"
|
|
#include <tjp/core/ptr/Ptr.hpp>
|
|
|
|
namespace tjp::core {
|
|
|
|
struct FuturePersist
|
|
{
|
|
virtual ~FuturePersist () {}
|
|
|
|
virtual void inject(std::function<void(FuturePersist *)> &&t) = 0;
|
|
} ;
|
|
|
|
template<typename T>
|
|
struct FuturePersistTyped : FuturePersist
|
|
{
|
|
Future<T> f;
|
|
|
|
FuturePersistTyped(const Future<T> &f_) :
|
|
f(f_)
|
|
{}
|
|
|
|
void inject(std::function<void(FuturePersist *)> &&t) override
|
|
{
|
|
f = f.then([t=std::move(t), this](auto &&f_) {
|
|
f_.wait();
|
|
|
|
t(this);
|
|
return f_.get();
|
|
});
|
|
}
|
|
} ;
|
|
|
|
struct Futures
|
|
{
|
|
struct Internal;
|
|
StrongPtr<Internal> internal;
|
|
|
|
struct NoConstructInternal;
|
|
|
|
Futures (NoConstructInternal);
|
|
|
|
Futures ();
|
|
~Futures ();
|
|
|
|
void add(const StrongPtr<FuturePersist> &future);
|
|
|
|
template<typename T>
|
|
Future<T> add(const Future<T> &future)
|
|
{
|
|
auto persisted = strong<FuturePersistTyped<T>>(future);
|
|
add(persisted);
|
|
|
|
return persisted->f;
|
|
}
|
|
|
|
bool empty() const;
|
|
void clear();
|
|
} ;
|
|
|
|
struct FuturesEvent : Futures
|
|
{
|
|
using Super = Futures;
|
|
|
|
FuturesEvent ();
|
|
|
|
void wait ();
|
|
} ;
|
|
|
|
struct FuturesFuture : Futures
|
|
{
|
|
using Super = Futures;
|
|
|
|
FuturesFuture ();
|
|
|
|
Future<void> get_future();
|
|
} ;
|
|
|
|
} // namespace
|
|
|
|
#ifdef TJP_CORE_HEADER_ONLY
|
|
#include "Futures.cpp"
|
|
#endif
|