//
// Copyright (c) 2011 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

#include "compiler/intermediate.h"

struct TLoopIndexInfo {
    int id;
    int initValue;
    int stopValue;
    int incrementValue;
    TOperator op;
    int currentValue;
};

class ForLoopUnroll {
public:
    ForLoopUnroll() { }

    void FillLoopIndexInfo(TIntermLoop* node, TLoopIndexInfo& info);

    // Update the info.currentValue for the next loop iteration.
    void Step();

    // Return false if loop condition is no longer satisfied.
    bool SatisfiesLoopCondition();

    // Check if the symbol is the index of a loop that's unrolled.
    bool NeedsToReplaceSymbolWithValue(TIntermSymbol* symbol);

    // Return the current value of a given loop index symbol.
    int GetLoopIndexValue(TIntermSymbol* symbol);

    void Push(TLoopIndexInfo& info);
    void Pop();

private:
    int getLoopIncrement(TIntermLoop* node);

    int evaluateIntConstant(TIntermConstantUnion* node);

    TVector<TLoopIndexInfo> mLoopIndexStack;
};

