// TVectorInsertionsAndDeletions.h
//
// Author David Barrett-Lennard
// (C)opyright Cedanet Pty Ltd 2019

#pragma once
#include "TVectorInsertions.h"
#include "TVectorDeletions.h"

namespace ceda
{

template<typename S, typename T, typename I>
struct TVectorInsertionsAndDeletions
{
    using Opid = TOpid<S,T>;
    using VectorInsertions = TVectorInsertions<S,T,I>;
    using VectorDeletions = TVectorDeletions<S,T,I>;
    
    bool operator==(const TVectorInsertionsAndDeletions& rhs) const
    {
        return m_insertions == rhs.m_insertions &&
               m_deletions == rhs.m_deletions;
    }
    bool operator!=(const TVectorInsertionsAndDeletions& rhs) const { return !operator==(rhs); }

    void LocalInsertInterval_p(const Opid& opid, ssize_t p, ssize_t n)
    {
        ssize_t q = m_deletions.OnLocalInsertInterval_p(p, n);
        m_insertions.LocalInsertInterval_q(opid, q, n);
    }
    void LocalDeleteInterval_p(const Opid& opid, ssize_t p, ssize_t n)
    {
        m_deletions.LocalDeleteInterval_p(opid,p,n);
    }
    
    VectorInsertions m_insertions;
    VectorDeletions m_deletions;
};

template<typename S, typename T, typename I>
Archive& operator<<(Archive& ar, const TVectorInsertionsAndDeletions<S,T,I>& x)
{
    ar << x.m_insertions << x.m_deletions;
    return ar;
}

template<typename S, typename T, typename I>
InputArchive operator>>(InputArchive ar, TVectorInsertionsAndDeletions<S,T,I>& x)
{
    return ar >> x.m_insertions >> x.m_deletions;
}

template<typename S, typename T, typename I>
xostream& operator<<(xostream& os, const TVectorInsertionsAndDeletions<S,T,I>& x)
{
    os << "(i=" << x.m_insertions
       << " d=" << x.m_deletions
       << ')';
	return os;
}

} // namespace ceda

