// C++17: synthetic computation; generation/revision guards discard stale results.
#include <cassert>
#include <future>
#include <iostream>
#include <memory>
#include <vector>
struct Result { int generation, revision; float value; };
int main() {
    auto input = std::make_shared<const std::vector<float>>(std::vector<float>{1,2,3});
    auto launch = [input](int generation, int revision) {
        return std::async(std::launch::async, [input,generation,revision] {
            float total=0; for(float value:*input) total+=value;
            return Result{generation,revision,total};
        });
    };
    auto old = launch(1,1);
    int currentGeneration=2, currentRevision=1; // User cancelled/replaced request 1.
    const auto stale=old.get(); // Test harness waits; a UI thread should poll or dispatch completion.
    const auto applicable = [&](Result r) { return r.generation==currentGeneration && r.revision==currentRevision; };
    assert(!applicable(stale));
    auto active = launch(2,1); const auto good=active.get();
    assert(applicable(good) && good.value==6);
    ++currentRevision; assert(!applicable(good)); // Document changed before applying.
    std::cout << "PASS: input ownership, cancellation discard, success, stale document\n";
}
