#ifndef CFE_FACTORY_H
#define CFE_FACTORY_H
#include "common/suif_list.h"
#include "common/MString.h"
#include "common/i_integer.h"
#include "cfe_forwarders.h"
#include "iokernel/meta_class.h"
#include "suifkernel/real_object_factory.h"
#include "iokernel/stl_meta_class.h"
#ifdef SUIF_NAMESPACE
namespace SUIF_NAMESPACE {
#endif
CForStatement* create_c_for_statement(SuifEnv *env,Statement* sf_owned before,Expression* sf_owned test,Statement* sf_owned step,Statement* sf_owned body,Statement* sf_owned pre_pad= 0,CodeLabelSymbol*  break_label= 0,CodeLabelSymbol*  continue_label= 0);

CallExpression* create_call_expression(SuifEnv *env,DataType*  result_type,Expression* sf_owned callee_address);

CExpression* create_c_expression(SuifEnv *env,DataType*  result_type,Statement* sf_owned statement,Expression* sf_owned expression);

BitSizeOfExpression* create_bit_size_of_expression(SuifEnv *env,DataType*  result_type,Type*  ref_type);

ByteSizeOfExpression* create_byte_size_of_expression(SuifEnv *env,DataType*  result_type,Type*  ref_type);

BitAlignmentOfExpression* create_bit_alignment_of_expression(SuifEnv *env,DataType*  result_type,Type*  ref_type);

ByteAlignmentOfExpression* create_byte_alignment_of_expression(SuifEnv *env,DataType*  result_type,Type*  ref_type);

BitOffsetOfExpression* create_bit_offset_of_expression(SuifEnv *env,DataType*  result_type,FieldSymbol*  field);

ByteOffsetOfExpression* create_byte_offset_of_expression(SuifEnv *env,DataType*  result_type,FieldSymbol*  field);

ScAndExpression* create_sc_and_expression(SuifEnv *env,DataType*  result_type,Expression* sf_owned source1,Expression* sf_owned source2);

ScOrExpression* create_sc_or_expression(SuifEnv *env,DataType*  result_type,Expression* sf_owned source1,Expression* sf_owned source2);

ScSelectExpression* create_sc_select_expression(SuifEnv *env,DataType*  result_type,Expression* sf_owned selector,Expression* sf_owned selection1,Expression* sf_owned selection2);

CStringConstant* create_c_string_constant(SuifEnv *env,DataType*  result_type,const String  & value);

class CfeObjectFactory : public RealObjectFactory {
  public:
    static const LString &get_class_name();
    virtual const LString &getName();
    virtual CForStatement* create_c_for_statement(Statement* sf_owned before,Expression* sf_owned test,Statement* sf_owned step,Statement* sf_owned body,Statement* sf_owned pre_pad= 0,CodeLabelSymbol*  break_label= 0,CodeLabelSymbol*  continue_label= 0);
    virtual CallExpression* create_call_expression(DataType*  result_type,Expression* sf_owned callee_address);
    virtual CExpression* create_c_expression(DataType*  result_type,Statement* sf_owned statement,Expression* sf_owned expression);
    virtual BitSizeOfExpression* create_bit_size_of_expression(DataType*  result_type,Type*  ref_type);
    virtual ByteSizeOfExpression* create_byte_size_of_expression(DataType*  result_type,Type*  ref_type);
    virtual BitAlignmentOfExpression* create_bit_alignment_of_expression(DataType*  result_type,Type*  ref_type);
    virtual ByteAlignmentOfExpression* create_byte_alignment_of_expression(DataType*  result_type,Type*  ref_type);
    virtual BitOffsetOfExpression* create_bit_offset_of_expression(DataType*  result_type,FieldSymbol*  field);
    virtual ByteOffsetOfExpression* create_byte_offset_of_expression(DataType*  result_type,FieldSymbol*  field);
    virtual ScAndExpression* create_sc_and_expression(DataType*  result_type,Expression* sf_owned source1,Expression* sf_owned source2);
    virtual ScOrExpression* create_sc_or_expression(DataType*  result_type,Expression* sf_owned source1,Expression* sf_owned source2);
    virtual ScSelectExpression* create_sc_select_expression(DataType*  result_type,Expression* sf_owned selector,Expression* sf_owned selection1,Expression* sf_owned selection2);
    virtual CStringConstant* create_c_string_constant(DataType*  result_type,const String  & value);
    
        
        virtual void init_io( ObjectFactory* of );
        
  
  protected:
    };

#ifdef SUIF_NAMESPACE
}
#ifndef NO_IMPLICIT_USING
using namespace SUIF_NAMESPACE;
#endif
#endif
#endif
