Program Listing for File OperatorDescriptors.h

Program Listing for File OperatorDescriptors.h#

Return to documentation for file (src/midend/astUtil/annotation/OperatorDescriptors.h)

#ifndef ___OPERATION_DESCRIPTORS_H
#define ___OPERATION_DESCRIPTORS_H

#include "TypeAnnotation.h"
#include "AnnotExpr.h"
#include "FunctionObject.h"
typedef ContainerDescriptor<std::vector<NameDescriptor>, NameDescriptor,',','(',')'>
    ParamDescriptor;
typedef ContainerDescriptor<std::vector<TypeDescriptor>, TypeDescriptor,',','(',')'>
    ParamTypeDescriptor;
class ParameterDeclaration
{
  ParamDescriptor pars;
  ParamTypeDescriptor parTypes;
public:
  std::string get_param(int i) const { return pars[i]; }
  std::string get_param_type( int i) const { return parTypes[i]; }
  unsigned num_of_params() const { return pars.size(); }

  const ParamDescriptor& get_params() const { return pars; }
  const ParamTypeDescriptor& get_param_types() const { return parTypes; }

  void add_param( const std::string& type, const std::string& name)
    {
      pars.push_back( NameDescriptor(name));
      parTypes.push_back( TypeDescriptor(type));
    }

  void push_back( const SelectPair<TypeDescriptor, NameDescriptor, 0, 0>& cur)
   { add_param( cur.first, cur.second); }
  bool read( std::istream& in)
   {
      return ReadContainer<ParameterDeclaration,
                           CollectPair<TypeDescriptor, NameDescriptor,0>,
                           ',', '(', ')'>::read(*this, in);
   }
  void write( std::ostream& out) const { pars.write(out); }
  void Dump() const { write(std::cerr); }
  std::string ToString() const { std::stringstream out; write(out); return out.str(); }
};

class ReplaceParams
  : public MapObject<SymbolicVal, SymbolicVal>, public SymbolicVisitor
{
  virtual void VisitVar( const SymbolicVar &v);
  virtual SymbolicVal operator()( const SymbolicVal& v);

  std::map<std::string, SymbolicAstWrap> parmap;
  SymbolicVal cur;
public:
  ReplaceParams() {}
  ReplaceParams(const ParamDescriptor& decl,
                AstInterface::AstNodeList& args,
                Map2Object<AstInterface*,AstNodePtr,AstNodePtr>* codegen = 0);
  void add( const std::string& par, const AstNodePtr& arg,
                Map2Object<AstInterface*,AstNodePtr,AstNodePtr>* codegen = 0)
        { parmap[par] = SymbolicAstWrap(arg, codegen); }
  void operator() (SymbolicValDescriptor& result);
  SymbolicAstWrap find( const std::string& parname);
};
class OperatorDeclaration {
  std::string signiture; //operator name
  ParameterDeclaration pars; // parameter names and types
  static bool unique;
public:
  OperatorDeclaration() : signiture("") {}

  std::string get_signiture () const { return signiture; }
  static std::string get_signiture( AstInterface& fa, const std::string& fname,
                                    const AstInterface::AstTypeList& params);
  static void set_unique() { unique = true; }

  const ParameterDeclaration& get_param_info() const { return pars; }

  OperatorDeclaration& read( std::istream& in);
  void write( std::ostream& out) const;
  void Dump() const { write(std::cerr); }
  std::string ToString() const { std::stringstream out; write(out); return out.str(); }
};

template <class BaseClass>
class OPDescriptorTemp : public BaseClass
{
 protected:
  ParameterDeclaration decl;
 public:
  const ParameterDeclaration& get_param_decl() const { return decl; }
  void set_param_decl(const ParameterDeclaration& d) { decl = d; }
  void replace_val( MapObject<SymbolicVal, SymbolicVal>& repl) {}

  bool read( std::istream& in, const OperatorDeclaration& op)
    {
      decl = op.get_param_info();
      return BaseClass::read(in);
    }
   void write( std::ostream& out) const
   {
     decl.write(out);
     out << ":";
     BaseClass::write(out);
   }
  void Dump() const { write(std::cerr); }
};
typedef  SetDescriptor<NameDescriptor,',','(',')'> NameGroup;
typedef OPDescriptorTemp
         <ContainerDescriptor<std::list<NameGroup>, NameGroup,',','{','}'> >
OperatorAliasDescriptor;

class OperatorSideEffectDescriptor
: public OPDescriptorTemp <SetDescriptor<NameDescriptor, ',','{','}'> >
{
  int param_num;
  typedef OPDescriptorTemp <SetDescriptor<NameDescriptor, ',','{','}'> >
    BaseClass;
 public:
  OperatorSideEffectDescriptor() : param_num(0) {}
  bool contain_parameter(int index) const
    {
      NameDescriptor n (decl.get_param(index));
      return find(n) != end();
    }
  bool contain_global() const { return size() - param_num > 0; }
  void get_side_effect(AstInterface& fa, AstInterface::AstNodeList& args,
                       CollectObject<AstNodePtr>& collect);
  bool read( std::istream& in, const OperatorDeclaration& op);
};

class OperatorInlineDescriptor
  : public OPDescriptorTemp
          < CloseDescriptor< SymbolicValDescriptor, '{', '}'> >
{
  typedef OPDescriptorTemp
          < CloseDescriptor< SymbolicValDescriptor, '{', '}'> >
   BaseClass;
 public:
   void replace_val( MapObject<SymbolicVal, SymbolicVal>& repl)
    {
       CloseDescriptor< SymbolicValDescriptor, '{', '}'>::replace_val(repl);
    }
};


#endif