// MultiplyStack.h: Templateklasse CMultiplyStack
//
// von Martin Mittring     <mailto:Kosmokleaner@Kosmokleaner.de> <www.Kosmokleaner.de>
//
// Praktisch für verkettete Transformationen 
// z.B. MatrixStack (oberstes Element ist die Muliplikation aus allen Elementen)
// Anwendungsbeispiel: siehe unten
//
// Für (von mir sicher nicht beabsichtigte) Schäden übernehme ich keinerlei Haftung.
// Der Verkauf / die kommerzielle Nutzung dieses Quellcodes ist ohne Einwilligung möglich.
//
//////////////////////////////////////////////////////////////////////

#if !defined(MULTIPLYSTACK_H)
#define MULTIPLYSTACK_H


// T muß Zuweisungsoperator mit int unterstützen ( =1 soll Identität erzeugen)
// T muß Zuweisungsoperator mit T unterstützen
// T muß Copy-Konstruktor unterstützen
// T muß Multiplikation mit sich selbst unterstützen

template <class T, int size=64, bool MultiplyFromRight=true>
class CMultiplyStack  
{
    T       m_stack[size+1];        // Array der Elemente(0 ist immer Einheitselement)
    int     m_stacksize;            // Anzahl der gepushten Elemente

public:
    CMultiplyStack()
    {
        m_stacksize=0;
        m_stack[0]=1;               // Identitätszuweisung
    }

    // ***********************************
    bool    push( T a )
    {
        if(m_stacksize>=size)
            return(false);          // Array ist voll


        if(MultiplyFromRight)   m_stack[m_stacksize+1]=m_stack[m_stacksize]*a;
            else                m_stack[m_stacksize+1]=a*m_stack[m_stacksize];

        m_stacksize++;
        return(true);
    }
    
    // ***********************************
    T       gettop( void )
    {
        return(m_stack[m_stacksize]);
    }

    // ***********************************
    bool    pop( void )
    {
        if(m_stacksize>0){ m_stacksize--;return(true); }

        return(false);
    }
};






//////////////////////////////////////////////////////////////////////

/* Testprogramm: erfolgreich mit Debugger getestet

#include "MultiplyStack.h"          // CMultiplyStack<>

void test( void )
{
    CMultiplyStack<int,4> stack;        // Stackgröße: 4 Elemente, Typ: int

    int a;                  // Hilfsvariablen
    bool ret;               //

    a=stack.gettop();

    ret=stack.pop();

    ret=stack.push(2);
    a=stack.gettop();
    
    ret=stack.push(3);
    a=stack.gettop();
    
    ret=stack.push(4);
    a=stack.gettop();

    ret=stack.push(5);
    a=stack.gettop();

    ret=stack.push(5);
    a=stack.gettop();


    ret=stack.pop();
    a=stack.gettop();

    ret=stack.pop();
    a=stack.gettop();

    ret=stack.pop();
    a=stack.gettop();

    ret=stack.pop();
    a=stack.gettop();

    ret=stack.pop();
    a=stack.gettop();
}

*/

#endif // !defined(MULTIPLYSTACK_H)
