Files
core_future/tjp/core/future/Futures.hpp
2026-03-06 09:28:09 -05:00

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