OGLplus (0.52.0) a C++ wrapper for OpenGL

example_main.hpp
Go to the documentation of this file.
1 
9 #ifndef OGLPLUS_EXAMPLE_EXAMPLE_MAIN_1119071146_HPP
10 #define OGLPLUS_EXAMPLE_EXAMPLE_MAIN_1119071146_HPP
11 
14 #include <oglplus/error/limit.hpp>
16 
17 #include <oglplus/os/semaphore.hpp>
18 
19 #include <stdexcept>
20 #include <system_error>
21 #include <iostream>
22 #include <iomanip>
23 
24 namespace oglplus {
25 
26 inline void example_print_std_error_common(
27  std::exception& error,
28  std::ostream& errstr
29 )
30 {
31  errstr << "Message: '"
32  << error.what()
33  << "'"
34  << std::endl;
35 }
36 
37 inline void example_print_error_common(
38  Error& error,
39  std::ostream& errstr
40 )
41 {
42  if(error.SourceFile())
43  {
44  errstr << "Source file: '"
45  << error.SourceFile()
46  << "'"
47  << std::endl;
48  }
49 
50  if(error.SourceLine())
51  {
52  errstr << "Source line: "
53  << error.SourceLine()
54  << std::endl;
55  }
56 
57  if(error.SourceFunc())
58  {
59  errstr << "Source function: '"
60  << error.SourceFunc()
61  << "'"
62  << std::endl;
63  }
64  example_print_std_error_common(error, errstr);
65  if(error.GLFunc())
66  {
67  errstr << "GL function: '";
68 
69  if(error.GLLib())
70  {
71  errstr << error.GLLib();
72  }
73 
74  errstr << error.GLFunc()
75  << "'"
76  << std::endl;
77  }
78 
79 
80  if(error.EnumParam() || error.EnumParamName())
81  {
82  errstr << "GL constant: ";
83  if(error.EnumParamName())
84  {
85  errstr << "'"
86  << error.EnumParamName()
87  << "'";
88  }
89  else
90  {
91  errstr << "(0x"
92  << std::hex
93  << error.EnumParam()
94  << ")";
95  }
96  errstr << std::endl;
97  }
98 
99  if(error.BindTarget() || error.TargetName())
100  {
101  errstr << "Binding point: ";
102  if(error.TargetName())
103  {
104  errstr << "'"
105  << error.TargetName()
106  << "'";
107  }
108  else
109  {
110  errstr << "(0x"
111  << std::hex
112  << error.BindTarget()
113  << ")";
114  }
115  errstr << std::endl;
116  }
117 
118  if(error.ObjectTypeName() || error.ObjectType())
119  {
120  errstr << "Object type: ";
121  if(error.ObjectTypeName())
122  {
123  errstr << "'"
124  << error.ObjectTypeName()
125  << "'";
126  }
127  else
128  {
129  errstr << "(0x"
130  << std::hex
131  << error.ObjectType()
132  << ")";
133  }
134  errstr << std::endl;
135  }
136 
137  if((!error.ObjectDesc().empty()) || (error.ObjectName() >= 0))
138  {
139  errstr << "Object: ";
140  if(!error.ObjectDesc().empty())
141  {
142  errstr << "'"
143  << error.ObjectDesc()
144  << "'";
145  }
146  else
147  {
148  errstr << "("
149  << error.ObjectName()
150  << ")";
151  }
152  errstr << std::endl;
153  }
154 
155  if(error.SubjectTypeName() || error.SubjectType())
156  {
157  errstr << "Subject type: ";
158  if(error.SubjectTypeName())
159  {
160  errstr << "'"
161  << error.SubjectTypeName()
162  << "'";
163  }
164  else
165  {
166  errstr << "(0x"
167  << std::hex
168  << error.SubjectType()
169  << ")";
170  }
171  errstr << std::endl;
172  }
173 
174  if((!error.SubjectDesc().empty()) || (error.SubjectName() >= 0))
175  {
176  errstr << "Subject: ";
177  if(!error.SubjectDesc().empty())
178  {
179  errstr << "'"
180  << error.SubjectDesc()
181  << "'";
182  }
183  else
184  {
185  errstr << "("
186  << error.SubjectName()
187  << ")";
188  }
189  errstr << std::endl;
190  }
191 
192  if(error.Identifier())
193  {
194  errstr << "Identifier: '"
195  << error.Identifier()
196  << "'"
197  << std::endl;
198  }
199 
200  if(error.Index() >= 0)
201  {
202  errstr << "Index: ("
203  << error.Index()
204  << ")"
205  << std::endl;
206  }
207 
208  if(error.Value() != 0)
209  {
210  errstr << "Value: ("
211  << error.Value()
212  << ")"
213  << std::endl;
214  }
215 
216  if(error.Limit() != 0)
217  {
218  errstr << "Limit: ("
219  << error.Limit()
220  << ")"
221  << std::endl;
222  }
223 
224  if(!error.Log().empty())
225  {
226  errstr << "Log:"
227  << std::endl
228  << error.Log()
229  << std::endl;
230  }
231 }
232 
233 template <typename Func>
234 inline int example_guarded_exec(Func func, std::ostream& errstr)
235 {
236  try
237  {
238  return func();
239  }
240  catch(ProgVarError& pve)
241  {
242  errstr << "Program variable error" << std::endl;
243  example_print_error_common(pve, errstr);
244  }
245  catch(ProgramBuildError& pbe)
246  {
247  errstr << "Program build error" << std::endl;
248  example_print_error_common(pbe, errstr);
249  }
250  catch(LimitError& le)
251  {
252  errstr << "Limit error" << std::endl;
253  example_print_error_common(le, errstr);
254  }
255  catch(ObjectError& oe)
256  {
257  errstr << "Object error" << std::endl;
258  example_print_error_common(oe, errstr);
259  }
260  catch(Error& err)
261  {
262  errstr << "GL error" << std::endl;
263  example_print_error_common(err, errstr);
264  }
265  catch(std::system_error& sye)
266  {
267  errstr << "System error" << std::endl;
268  example_print_std_error_common(sye, errstr);
269  errstr << "Error code: " << sye.code() << std::endl;
270  errstr << std::endl;
271  }
272  catch(std::runtime_error& rte)
273  {
274  errstr << "Runtime error" << std::endl;
275  example_print_std_error_common(rte, errstr);
276  errstr << std::endl;
277  }
278  catch(std::exception& se)
279  {
280  errstr << "Error" << std::endl;
281  example_print_std_error_common(se, errstr);
282  errstr << std::endl;
283  }
284  return 1;
285 }
286 
287 inline int example_main(
288  int (*main_func)(int, char**),
289  int argc,
290  char ** argv
291 )
292 {
293  struct main_wrapper
294  {
295  int (*main_func)(int, char**);
296  int argc;
297  char** argv;
298 
299  int operator()(void) const
300  {
301  os::CriticalSection cs("OGLplus example");
302  Application::ParseCommandLineOptions(argc, argv);
303  return main_func(argc, argv);
304  }
305  } wrapped_main = {main_func, argc, argv};
306 
307  return example_guarded_exec(wrapped_main, std::cerr);
308 }
309 
310 } // namespace oglplus
311 
312 #endif // include guard
Program errors.
Declaration of OGLplus program-variable-related error.
Limited value error.
Application/startup options-related declarations unrelated to OpenGL.

Copyright © 2010-2014 Matúš Chochlík, University of Žilina, Žilina, Slovakia.
<matus.chochlik -at- fri.uniza.sk>
<chochlik -at -gmail.com>
Documentation generated on Mon Sep 22 2014 by Doxygen (version 1.8.6).