// Description: Mirroring index extender
// Documentation: indexextenders.txt
#ifndef PASTELSYS_MIRROREXTENDER_H
#define PASTELSYS_MIRROREXTENDER_H
#include "pastel/sys/extender/indexextender.h"
namespace Pastel
{
    class MirrorExtender
        : public IndexExtender
    {
    public:
        virtual ~MirrorExtender()
        {
        }
        virtual integer operator()(
            integer index, integer extent) const
        {
            // -1 => 1
            // extent => extent - 2
            const integer doubleExtent = 2 * extent;
            integer newIndex =
                mod(index, doubleExtent - 1);
            if (newIndex >= extent)
            {
                newIndex = (doubleExtent - 1) - newIndex;
            }
            return newIndex;
        }
    };
    using MirrorExtenderPtr = CountedPtr<MirrorExtender>;
    using ConstMirrorExtenderPtr = CountedPtr<const MirrorExtender>;
    inline MirrorExtenderPtr mirrorExtender()
    {
        return MirrorExtenderPtr(new MirrorExtender);
    }
}
#endif