Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* -*- c++ -*- */
  2. /*
  3.  * Copyright © 2010 Intel Corporation
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the next
  13.  * paragraph) shall be included in all copies or substantial portions of the
  14.  * Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22.  * DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. #pragma once
  26. #ifndef IR_VISITOR_H
  27. #define IR_VISITOR_H
  28.  
  29. /**
  30.  * Abstract base class of visitors of IR instruction trees
  31.  */
  32. class ir_visitor {
  33. public:
  34.    virtual ~ir_visitor()
  35.    {
  36.       /* empty */
  37.    }
  38.  
  39.    /**
  40.     * \name Visit methods
  41.     *
  42.     * As typical for the visitor pattern, there must be one \c visit method for
  43.     * each concrete subclass of \c ir_instruction.  Virtual base classes within
  44.     * the hierarchy should not have \c visit methods.
  45.     */
  46.    /*@{*/
  47.    virtual void visit(class ir_variable *) = 0;
  48.    virtual void visit(class ir_function_signature *) = 0;
  49.    virtual void visit(class ir_function *) = 0;
  50.    virtual void visit(class ir_expression *) = 0;
  51.    virtual void visit(class ir_texture *) = 0;
  52.    virtual void visit(class ir_swizzle *) = 0;
  53.    virtual void visit(class ir_dereference_variable *) = 0;
  54.    virtual void visit(class ir_dereference_array *) = 0;
  55.    virtual void visit(class ir_dereference_record *) = 0;
  56.    virtual void visit(class ir_assignment *) = 0;
  57.    virtual void visit(class ir_constant *) = 0;
  58.    virtual void visit(class ir_call *) = 0;
  59.    virtual void visit(class ir_return *) = 0;
  60.    virtual void visit(class ir_discard *) = 0;
  61.    virtual void visit(class ir_if *) = 0;
  62.    virtual void visit(class ir_loop *) = 0;
  63.    virtual void visit(class ir_loop_jump *) = 0;
  64.    /*@}*/
  65. };
  66.  
  67. /* NOTE: function calls may never return due to discards inside them
  68.  * This is usually not an issue, but if it is, keep it in mind
  69.  */
  70. class ir_control_flow_visitor : public ir_visitor {
  71. public:
  72.    virtual void visit(class ir_variable *) {}
  73.    virtual void visit(class ir_expression *) {}
  74.    virtual void visit(class ir_texture *) {}
  75.    virtual void visit(class ir_swizzle *) {}
  76.    virtual void visit(class ir_dereference_variable *) {}
  77.    virtual void visit(class ir_dereference_array *) {}
  78.    virtual void visit(class ir_dereference_record *) {}
  79.    virtual void visit(class ir_assignment *) {}
  80.    virtual void visit(class ir_constant *) {}
  81.    virtual void visit(class ir_call *) {}
  82. };
  83.  
  84. #endif /* IR_VISITOR_H */
  85.