/*
 Copyright 2019 Alain Dargelas
 
 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.
 */

/* 
 * File:   CompileStep.h
 * Author: alain
 *
 * Created on July 5, 2017, 10:44 PM
 */

#ifndef COMPILESTEP_H
#define COMPILESTEP_H
#include "../Design/VObject.h"
namespace SURELOG {

    class CompileStep {
    public:
        CompileStep();
        CompileStep(const CompileStep& orig);
        virtual ~CompileStep();

        virtual VObject& Object(NodeId index) = 0;

        virtual NodeId UniqueId(NodeId index) = 0;

        virtual SymbolId Name(NodeId index) = 0;

        virtual NodeId Child(NodeId index) = 0;

        virtual NodeId Sibling(NodeId index) = 0;

        virtual NodeId& Definition(NodeId index) = 0;

        virtual NodeId Parent(NodeId index) = 0;

        virtual unsigned short& Type(NodeId index) = 0;

        virtual unsigned int Line(NodeId index) = 0;

        virtual std::string Symbol(SymbolId id) = 0;
        
        virtual NodeId sl_get(NodeId parent, VObjectType type) = 0;  // Get first item of type
        
        virtual NodeId sl_parent(NodeId parent, VObjectType type) = 0;  // Get first parent item of type
        
        virtual NodeId sl_parent(NodeId parent, std::vector<VObjectType> types, VObjectType& actualType) = 0;

        virtual std::vector<NodeId> sl_get_all(NodeId parent, VObjectType type) = 0;  // get all items of type

        virtual NodeId sl_collect(NodeId parent, VObjectType type) = 0; // Recursively search for first item of type

        virtual std::vector<NodeId> sl_collect_all(NodeId parent, VObjectType type) = 0; // Recursively search for all items of type
        
        virtual std::string SymName(NodeId index) = 0 ;
        
        
    private:

    };

};

#endif /* COMPILESTEP_H */


