Subversion Repositories SmartDukaan

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 ashish 1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one
3
 * or more contributor license agreements. See the NOTICE file
4
 * distributed with this work for additional information
5
 * regarding copyright ownership. The ASF licenses this file
6
 * to you under the Apache License, Version 2.0 (the
7
 * "License"); you may not use this file except in compliance
8
 * with the License. You may obtain a copy of the License at
9
 *
10
 *   http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing,
13
 * software distributed under the License is distributed on an
14
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
 * KIND, either express or implied. See the License for the
16
 * specific language governing permissions and limitations
17
 * under the License.
18
 */
19
 
20
#ifndef T_PROGRAM_H
21
#define T_PROGRAM_H
22
 
23
#include <map>
24
#include <string>
25
#include <vector>
26
 
27
// For program_name()
28
#include "main.h"
29
 
30
#include "t_doc.h"
31
#include "t_scope.h"
32
#include "t_base_type.h"
33
#include "t_typedef.h"
34
#include "t_enum.h"
35
#include "t_const.h"
36
#include "t_struct.h"
37
#include "t_service.h"
38
#include "t_list.h"
39
#include "t_map.h"
40
#include "t_set.h"
41
//#include "t_doc.h"
42
 
43
/**
44
 * Top level class representing an entire thrift program. A program consists
45
 * fundamentally of the following:
46
 *
47
 *   Typedefs
48
 *   Enumerations
49
 *   Constants
50
 *   Structs
51
 *   Exceptions
52
 *   Services
53
 *
54
 * The program module also contains the definitions of the base types.
55
 *
56
 */
57
class t_program : public t_doc {
58
 public:
59
  t_program(std::string path, std::string name) :
60
    path_(path),
61
    name_(name),
62
    out_path_("./") {
63
    scope_ = new t_scope();
64
  }
65
 
66
  t_program(std::string path) :
67
    path_(path),
68
    out_path_("./") {
69
    name_ = program_name(path);
70
    scope_ = new t_scope();
71
  }
72
 
73
  // Path accessor
74
  const std::string& get_path() const { return path_; }
75
 
76
  // Output path accessor
77
  const std::string& get_out_path() const { return out_path_; }
78
 
79
  // Name accessor
80
  const std::string& get_name() const { return name_; }
81
 
82
  // Namespace
83
  const std::string& get_namespace() const { return namespace_; }
84
 
85
  // Include prefix accessor
86
  const std::string& get_include_prefix() const { return include_prefix_; }
87
 
88
  // Accessors for program elements
89
  const std::vector<t_typedef*>& get_typedefs()  const { return typedefs_;  }
90
  const std::vector<t_enum*>&    get_enums()     const { return enums_;     }
91
  const std::vector<t_const*>&   get_consts()    const { return consts_;    }
92
  const std::vector<t_struct*>&  get_structs()   const { return structs_;   }
93
  const std::vector<t_struct*>&  get_xceptions() const { return xceptions_; }
94
  const std::vector<t_struct*>&  get_objects()   const { return objects_;   }
95
  const std::vector<t_service*>& get_services()  const { return services_;  }
96
 
97
  // Program elements
98
  void add_typedef  (t_typedef* td) { typedefs_.push_back(td);  }
99
  void add_enum     (t_enum*    te) { enums_.push_back(te);     }
100
  void add_const    (t_const*   tc) { consts_.push_back(tc);    }
101
  void add_struct   (t_struct*  ts) { objects_.push_back(ts);
102
                                      structs_.push_back(ts);   }
103
  void add_xception (t_struct*  tx) { objects_.push_back(tx);
104
                                      xceptions_.push_back(tx); }
105
  void add_service  (t_service* ts) { services_.push_back(ts);  }
106
 
107
  // Programs to include
108
  const std::vector<t_program*>& get_includes() const { return includes_; }
109
 
110
  void set_out_path(std::string out_path) {
111
    out_path_ = out_path;
112
    // Ensure that it ends with a trailing '/' (or '\' for windows machines)
113
    char c = out_path_.at(out_path_.size() - 1);
114
    if (!(c == '/' || c == '\\')) {
115
      out_path_.push_back('/');
116
    }
117
  }
118
 
119
  // Scoping and namespacing
120
  void set_namespace(std::string name) {
121
    namespace_ = name;
122
  }
123
 
124
  // Scope accessor
125
  t_scope* scope() {
126
    return scope_;
127
  }
128
 
129
  // Includes
130
 
131
  void add_include(std::string path, std::string include_site) {
132
    t_program* program = new t_program(path);
133
 
134
    // include prefix for this program is the site at which it was included
135
    // (minus the filename)
136
    std::string include_prefix;
137
    std::string::size_type last_slash = std::string::npos;
138
    if ((last_slash = include_site.rfind("/")) != std::string::npos) {
139
      include_prefix = include_site.substr(0, last_slash);
140
    }
141
 
142
    program->set_include_prefix(include_prefix);
143
    includes_.push_back(program);
144
  }
145
 
146
  std::vector<t_program*>& get_includes() {
147
    return includes_;
148
  }
149
 
150
  void set_include_prefix(std::string include_prefix) {
151
    include_prefix_ = include_prefix;
152
 
153
    // this is intended to be a directory; add a trailing slash if necessary
154
    int len = include_prefix_.size();
155
    if (len > 0 && include_prefix_[len - 1] != '/') {
156
      include_prefix_ += '/';
157
    }
158
  }
159
 
160
  // Language neutral namespace / packaging
161
  void set_namespace(std::string language, std::string name_space) {
162
    namespaces_[language] = name_space;
163
  }
164
 
165
  std::string get_namespace(std::string language) const {
166
    std::map<std::string, std::string>::const_iterator iter = namespaces_.find(language);
167
    if (iter == namespaces_.end()) {
168
      return std::string();
169
    }
170
    return iter->second;
171
  }
172
 
173
  // Language specific namespace / packaging
174
 
175
  void add_cpp_include(std::string path) {
176
    cpp_includes_.push_back(path);
177
  }
178
 
179
  const std::vector<std::string>& get_cpp_includes() {
180
    return cpp_includes_;
181
  }
182
 
183
 private:
184
 
185
  // File path
186
  std::string path_;
187
 
188
  // Name
189
  std::string name_;
190
 
191
  // Output directory
192
  std::string out_path_;
193
 
194
  // Namespace
195
  std::string namespace_;
196
 
197
  // Included programs
198
  std::vector<t_program*> includes_;
199
 
200
  // Include prefix for this program, if any
201
  std::string include_prefix_;
202
 
203
  // Identifier lookup scope
204
  t_scope* scope_;
205
 
206
  // Components to generate code for
207
  std::vector<t_typedef*> typedefs_;
208
  std::vector<t_enum*>    enums_;
209
  std::vector<t_const*>   consts_;
210
  std::vector<t_struct*>  objects_;
211
  std::vector<t_struct*>  structs_;
212
  std::vector<t_struct*>  xceptions_;
213
  std::vector<t_service*> services_;
214
 
215
  // Dynamic namespaces
216
  std::map<std::string, std::string> namespaces_;
217
 
218
  // C++ extra includes
219
  std::vector<std::string> cpp_includes_;
220
 
221
};
222
 
223
#endif