/*
 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:   Enum.h
 * Author: alain
 *
 * Created on May 19, 2019, 11:55 AM
 */

#ifndef ENUM_H
#define ENUM_H
#include <string>
#include <map>
#include "DataType.h"

namespace SURELOG {

    class Value;
    class FileContent;
    
    class Enum : public DataType {
    public:
        Enum(std::string name, FileContent* fC, NodeId nodeId, VObjectType baseType);
        void addValue(std::string& name, Value* value) { m_values.insert(std::make_pair(name, value)); }
        Value* getValue(std::string& name);
        VObjectType getBaseType() { return m_baseType; }
        typedef std::map<std::string, Value*> NameValueMap;

        virtual ~Enum();
    private:
        NameValueMap m_values;
        VObjectType  m_baseType;
    };

};

#endif /* ENUM_H */


