Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1901 serge 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 */