Skip to content

File json_iter.hpp

File List > backends > cxx > include > zmbt > core > json_iter.hpp

Go to the documentation of this file

#ifndef ZMBT_CORE_JSON_ITER_HPP_
#define ZMBT_CORE_JSON_ITER_HPP_


#include "aliases.hpp"

#include "exceptions.hpp"


namespace zmbt {



class JsonIter
{
    virtual void step() = 0;
public:


    JsonIter() = default;
    virtual ~JsonIter() = default;
    JsonIter(JsonIter const&) = default;
    JsonIter& operator=(JsonIter const&) = default;
    JsonIter(JsonIter &&) = default;
    JsonIter& operator=(JsonIter &&) = default;

    virtual bool halt() const = 0;

    virtual boost::json::array get() = 0;

    JsonIter& operator++(int)
    {
        if (!halt())
        {
            this->step();
        }
        return *(this);
    };

    boost::json::array operator*()
    {
        return get();
    }
};


class JsonIterZipProdBase : public virtual JsonIter
{
protected:

    bool halt_{false};
    std::vector<boost::json::array::const_iterator> begins_{};
    std::vector<boost::json::array::const_iterator> ends_{};
    std::vector<boost::json::array::const_iterator> its_{};

    boost::json::array owned_sequences_; // capture temporaries

private:

    void init_iters(boost::json::array const& seqences);

public:

    bool halt() const final
    {
        return halt_;
    }

    explicit JsonIterZipProdBase(boost::json::array const& sequences) : JsonIter(), owned_sequences_{}
    {
        init_iters(sequences);
    }

    explicit JsonIterZipProdBase(boost::json::array && seqences) : JsonIter(), owned_sequences_(std::move(seqences))
    {
        init_iters(owned_sequences_);
    }

    JsonIterZipProdBase() : JsonIterZipProdBase([]{
            boost::json::array arr {};
            arr.push_back(boost::json::array{});
            return arr;
        }()) // default iter yields empty set
    {
    }

    virtual ~JsonIterZipProdBase() = default;

    JsonIterZipProdBase(JsonIterZipProdBase const&) = default;
    JsonIterZipProdBase& operator=(JsonIterZipProdBase const&) = default;

    JsonIterZipProdBase(JsonIterZipProdBase &&) = default;
    JsonIterZipProdBase& operator=(JsonIterZipProdBase &&) = default;


    boost::json::array get() final;
};


class JsonProdIter : public virtual JsonIterZipProdBase
{
    void step() final;

    public:
    using JsonIterZipProdBase::JsonIterZipProdBase;

};


class JsonZipIter : public virtual JsonIterZipProdBase
{
    void step() final;
    public:
    using JsonIterZipProdBase::JsonIterZipProdBase;
};


}

#endif