/*
 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
 *
 * Squid software is distributed under GPLv2+ license and includes
 * contributions from numerous individuals and organizations.
 * Please see the COPYING and CONTRIBUTORS files for details.
 */

/* DEBUG: section 86    ESI processing */

#ifndef SQUID_SRC_ESI_SEQUENCE_H
#define SQUID_SRC_ESI_SEQUENCE_H

#include "esi/Element.h"
#include "mem/forward.h"

/* esiSequence */

class esiSequence : public ESIElement
{
    MEMPROXY_CLASS(esiSequence);

public:
    esiSequence(esiTreeParentPtr, bool = false);
    ~esiSequence() override;

    void render(ESISegment::Pointer) override;
    bool addElement (ESIElement::Pointer) override;
    esiProcessResult_t process (int dovars) override;
    void provideData (ESISegment::Pointer, ESIElement*) override;
    bool mayFail () const override;
    void wontFail();
    void fail(ESIElement *, char const *anError = nullptr) override;
    void makeCachableElements(esiSequence const &old);
    Pointer makeCacheable() const override;
    void makeUsableElements(esiSequence const &old, ESIVarState &);
    Pointer makeUsable(esiTreeParentPtr, ESIVarState &) const override;

    Esi::Elements elements; /* unprocessed or rendered nodes */
    size_t processedcount;

    struct {
        unsigned int dovars:1; /* for esiVar */
    } flags;
    void finish() override;

protected:
    esiSequence(esiSequence const &);
    esiTreeParentPtr parent;

private:
    int elementIndex (ESIElement::Pointer anElement) const;
    bool mayFail_;
    bool failed;
    esiProcessResult_t processOne(int, size_t);
    bool const provideIncrementalData;
    bool processing;
    esiProcessResult_t processingResult;
    size_t nextElementToProcess_;
    size_t nextElementToProcess() const;
    void nextElementToProcess(size_t const &);
    bool finishedProcessing() const;
    void processStep(int dovars);
};

#endif /* SQUID_SRC_ESI_SEQUENCE_H */

