blob: be0b83e32f7ac000d28376b9150421a7fde99983 [file] [log] [blame]
Mark Slee31985722006-05-24 21:45:31 +00001#ifndef T_GENERATOR_H
2#define T_GENERATOR_H
3
4#include <string>
5#include <iostream>
Mark Sleee8540632006-05-30 09:24:40 +00006#include <sstream>
Mark Slee31985722006-05-24 21:45:31 +00007#include "parse/t_program.h"
8
9/**
10 * Base class for a thrift code generator. This class defines the basic
11 * routines for code generation and contains the top level method that
12 * dispatches code generation across various components.
13 *
14 * @author Mark Slee <mcslee@facebook.com>
15 */
16class t_generator {
17 public:
Mark Sleee8540632006-05-30 09:24:40 +000018 t_generator() { tmp_ = 0; }
Mark Slee31985722006-05-24 21:45:31 +000019 virtual ~t_generator() {}
20
21 /**
22 * Framework generator method that iterates over all the parts of a program
23 * and performs general actions. This is implemented by the base class and
24 * should not be overwritten in the subclasses.
25 */
26 void generate_program (t_program* tprogram);
27
28 protected:
29 /** Optional methods that may be imlemented by subclasses. */
Mark Sleee8540632006-05-30 09:24:40 +000030
Mark Slee31985722006-05-24 21:45:31 +000031 virtual void init_generator (t_program* tprogram) {}
32 virtual void close_generator () {}
33
34 /** Pure virtual methods implemented by the generator subclasses. */
Mark Sleee8540632006-05-30 09:24:40 +000035
Mark Slee31985722006-05-24 21:45:31 +000036 virtual void generate_typedef (t_typedef* ttypedef) = 0;
37 virtual void generate_enum (t_enum* tenum) = 0;
38 virtual void generate_struct (t_struct* tstruct) = 0;
39 virtual void generate_service (t_service* tservice) = 0;
40
Mark Sleee8540632006-05-30 09:24:40 +000041 /** Method to get the program name, may be overridden */
42
43 virtual std::string get_program_name(t_program* tprogram) {
44 return tprogram->get_name();
45 }
46
47 /** Method to get the service name, may be overridden */
48 virtual std::string get_service_name(t_service* tservice) {
49 return tservice->get_name();
50 }
51
52 /** Creates a unique temporary variable name. */
53 std::string tmp(std::string name) {
54 std::ostringstream out;
55 out << name << tmp_++;
56 return out.str();
57 }
58
Mark Slee31985722006-05-24 21:45:31 +000059 /** Indentation level modifiers */
Mark Sleee8540632006-05-30 09:24:40 +000060
Mark Slee31985722006-05-24 21:45:31 +000061 void indent_up() { ++indent_; }
62 void indent_down() { --indent_; }
63
64 /** Indentation print function */
65 std::string indent() {
66 std::string ind = "";
67 int i;
68 for (i = 0; i < indent_; ++i) {
69 ind += " ";
70 }
71 return ind;
72 }
73
Mark Sleee8540632006-05-30 09:24:40 +000074 /** Indentation utility wrapper */
Mark Slee31985722006-05-24 21:45:31 +000075 std::ostream& indent(std::ostream &os) {
76 return os << indent();
77 }
78
Mark Sleee8540632006-05-30 09:24:40 +000079 protected:
80 /** Quick accessor for formatted program name */
81 std::string program_name_;
82
83 /** Quick accessor for formatted service name */
84 std::string service_name_;
85
Mark Slee31985722006-05-24 21:45:31 +000086 private:
87 /** Indentation level */
88 int indent_;
89
Mark Sleee8540632006-05-30 09:24:40 +000090 /** Temporary variable counter */
91 int tmp_;
Mark Slee31985722006-05-24 21:45:31 +000092};
93
94#endif