/* FILE:		grph.h
 *  DATE MODIFIED:	31-Aug-07
 *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
 *
 *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
 *                                                                           *
 *  Licensed under the Apache License, Version 2.0 (the 'License');          *
 *  you may not use this file except in compliance with the License.         *
 *                                                                           *
 *  You may obtain a copy of the License at                                  *
 *      http://www.apache.org/licenses/LICENSE-2.0                           *
 *                                                                           *
 *  Unless required by applicable law or agreed to in writing, software      *
 *  distributed under the License is distributed on an 'AS IS' BASIS,        *
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 
 *  See the License for the specific language governing permissions and      *
 *  limitations under the License.                                           *
 *                                                                           *
 *---------------------------------------------------------------------------*/

#include "sub_grph.h"

class Graph
{
public:
    Graph (const char *name)
    {
        int count= strlen(name);
        title= new char [count+1];
        strcpy (title, name);
        numSubGraph= 0;
        subGraph= 0;
        subIndex= 0;
    };

    ~Graph()
    {
        delete [] subGraph;
        delete [] subIndex;
        delete [] title;
    }

    int addSubGraph (SubGraph *subGraph);
    int getSubGraphIndex (SubGraph *subGraph);

    void BeginRule (SubGraph *subg);
    void EndRule (SubGraph *subg);
    void BeginItem (SubGraph *subg);
    void BeginItemRepeat (SubGraph *subg, int min_count, int max_count);
    void AddRuleRef (SubGraph *subg, int ruleNo);
    void AddLabel (SubGraph *subg, int labNo);
    void AddTag (SubGraph *subg, int tagNo);
    void EndItem (SubGraph *subg);
    void BeginOneOf (SubGraph *subg);
    void EndOneOf (SubGraph *subg);
    void BeginCount (SubGraph *subg, int minCount, int maxCount);
    void EndCount (SubGraph *subg);
    void BeginOptional (SubGraph *subg);

    void ExpandRules (SubGraph *subg);

private:

    int         numSubGraph;
    SubGraph    **subGraph;
    int         *subIndex;

    int getSubGraphIndex (int subId);

    char        *title;

};