cppParameterList.cxx 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. // Filename: cppParameterList.cxx
  2. // Created by: drose (21Oct99)
  3. //
  4. ////////////////////////////////////////////////////////////////////
  5. //
  6. // PANDA 3D SOFTWARE
  7. // Copyright (c) Carnegie Mellon University. All rights reserved.
  8. //
  9. // All use of this software is subject to the terms of the revised BSD
  10. // license. You should have received a copy of this license along
  11. // with this source code in a file named "LICENSE."
  12. //
  13. ////////////////////////////////////////////////////////////////////
  14. #include "cppParameterList.h"
  15. #include "cppInstance.h"
  16. ////////////////////////////////////////////////////////////////////
  17. // Function: CPPParameterList::Constructor
  18. // Access: Public
  19. // Description:
  20. ////////////////////////////////////////////////////////////////////
  21. CPPParameterList::
  22. CPPParameterList() {
  23. _includes_ellipsis = false;
  24. }
  25. ////////////////////////////////////////////////////////////////////
  26. // Function: CPPParameterList::is_equivalent
  27. // Access: Public
  28. // Description: This is similar to operator == except it is more
  29. // forgiving: it is true if only the length and order of
  30. // types is the same, never minding the instance names
  31. // or initial values.
  32. ////////////////////////////////////////////////////////////////////
  33. bool CPPParameterList::
  34. is_equivalent(const CPPParameterList &other) const {
  35. if (_includes_ellipsis != other._includes_ellipsis) {
  36. return false;
  37. }
  38. if (_parameters.size() != other._parameters.size()) {
  39. return false;
  40. }
  41. for (int i = 0; i < (int)_parameters.size(); ++i) {
  42. if (!_parameters[i]->_type->is_equivalent(*other._parameters[i]->_type)) {
  43. return false;
  44. }
  45. }
  46. return true;
  47. }
  48. ////////////////////////////////////////////////////////////////////
  49. // Function: CPPParameterList::Equality Operator
  50. // Access: Public
  51. // Description:
  52. ////////////////////////////////////////////////////////////////////
  53. bool CPPParameterList::
  54. operator == (const CPPParameterList &other) const {
  55. if (_includes_ellipsis != other._includes_ellipsis) {
  56. return false;
  57. }
  58. if (_parameters.size() != other._parameters.size()) {
  59. return false;
  60. }
  61. for (int i = 0; i < (int)_parameters.size(); ++i) {
  62. if (*_parameters[i] != *other._parameters[i]) {
  63. return false;
  64. }
  65. }
  66. return true;
  67. }
  68. ////////////////////////////////////////////////////////////////////
  69. // Function: CPPParameterList::Inequality Operator
  70. // Access: Public
  71. // Description:
  72. ////////////////////////////////////////////////////////////////////
  73. bool CPPParameterList::
  74. operator != (const CPPParameterList &other) const {
  75. return !(*this == other);
  76. }
  77. ////////////////////////////////////////////////////////////////////
  78. // Function: CPPParameterList::Ordering Operator
  79. // Access: Public
  80. // Description:
  81. ////////////////////////////////////////////////////////////////////
  82. bool CPPParameterList::
  83. operator < (const CPPParameterList &other) const {
  84. if (_includes_ellipsis != other._includes_ellipsis) {
  85. return _includes_ellipsis < other._includes_ellipsis;
  86. }
  87. if (_parameters.size() != other._parameters.size()) {
  88. return _parameters.size() < other._parameters.size();
  89. }
  90. for (int i = 0; i < (int)_parameters.size(); ++i) {
  91. if (*_parameters[i] != *other._parameters[i]) {
  92. return *_parameters[i] < *other._parameters[i];
  93. }
  94. }
  95. return false;
  96. }
  97. ////////////////////////////////////////////////////////////////////
  98. // Function: CPPParameterList::is_tbd
  99. // Access: Public
  100. // Description: Returns true if any of the types in the parameter
  101. // list are base on CPPTBDType.
  102. ////////////////////////////////////////////////////////////////////
  103. bool CPPParameterList::
  104. is_tbd() const {
  105. for (int i = 0; i < (int)_parameters.size(); ++i) {
  106. if (_parameters[i]->_type->is_tbd()) {
  107. return true;
  108. }
  109. }
  110. return false;
  111. }
  112. ////////////////////////////////////////////////////////////////////
  113. // Function: CPPParameterList::is_parameter_expr
  114. // Access: Public
  115. // Description: Returns true if any of the types in the parameter
  116. // list turns out to be a constant expression, which is
  117. // a clue that this parameter list is actually intended
  118. // to be an instance declaration.
  119. ////////////////////////////////////////////////////////////////////
  120. bool CPPParameterList::
  121. is_parameter_expr() const {
  122. for (int i = 0; i < (int)_parameters.size(); ++i) {
  123. if (_parameters[i]->_type->is_parameter_expr()) {
  124. return true;
  125. }
  126. }
  127. return false;
  128. }
  129. ////////////////////////////////////////////////////////////////////
  130. // Function: CPPParameterList::is_fully_specified
  131. // Access: Public
  132. // Description: Returns true if this declaration is an actual,
  133. // factual declaration, or false if some part of the
  134. // declaration depends on a template parameter which has
  135. // not yet been instantiated.
  136. ////////////////////////////////////////////////////////////////////
  137. bool CPPParameterList::
  138. is_fully_specified() const {
  139. for (int i = 0; i < (int)_parameters.size(); ++i) {
  140. if (!_parameters[i]->is_fully_specified()) {
  141. return false;
  142. }
  143. }
  144. return true;
  145. }
  146. ////////////////////////////////////////////////////////////////////
  147. // Function: CPPParameterList::substitute_decl
  148. // Access: Public
  149. // Description:
  150. ////////////////////////////////////////////////////////////////////
  151. CPPParameterList *CPPParameterList::
  152. substitute_decl(CPPDeclaration::SubstDecl &subst,
  153. CPPScope *current_scope, CPPScope *global_scope) {
  154. CPPParameterList *rep = new CPPParameterList;
  155. bool any_changed = false;
  156. for (int i = 0; i < (int)_parameters.size(); ++i) {
  157. CPPInstance *inst =
  158. _parameters[i]->substitute_decl(subst, current_scope, global_scope)
  159. ->as_instance();
  160. if (inst != _parameters[i]) {
  161. any_changed = true;
  162. }
  163. rep->_parameters.push_back(inst);
  164. }
  165. if (!any_changed) {
  166. delete rep;
  167. rep = this;
  168. }
  169. return rep;
  170. }
  171. ////////////////////////////////////////////////////////////////////
  172. // Function: CPPParameterList::resolve_type
  173. // Access: Public
  174. // Description: Returns an equivalent CPPParameterList, in which all
  175. // of the individual types have been resolved.
  176. ////////////////////////////////////////////////////////////////////
  177. CPPParameterList *CPPParameterList::
  178. resolve_type(CPPScope *current_scope, CPPScope *global_scope) {
  179. CPPParameterList *rep = new CPPParameterList;
  180. bool any_changed = false;
  181. for (int i = 0; i < (int)_parameters.size(); ++i) {
  182. CPPInstance *inst = _parameters[i];
  183. CPPType *new_type = inst->_type;
  184. if (new_type->is_tbd()) {
  185. new_type = new_type->resolve_type(current_scope, global_scope);
  186. }
  187. if (new_type != inst->_type) {
  188. any_changed = true;
  189. CPPInstance *new_inst = new CPPInstance(*inst);
  190. new_inst->_type = new_type;
  191. rep->_parameters.push_back(new_inst);
  192. } else {
  193. rep->_parameters.push_back(inst);
  194. }
  195. }
  196. if (!any_changed) {
  197. delete rep;
  198. rep = this;
  199. }
  200. return rep;
  201. }
  202. ////////////////////////////////////////////////////////////////////
  203. // Function: CPPParameterList::output
  204. // Access: Public
  205. // Description: If num_default_parameters is >= 0, it indicates the
  206. // number of default parameter values to show on output.
  207. // Otherwise, all parameter values are shown.
  208. ////////////////////////////////////////////////////////////////////
  209. void CPPParameterList::
  210. output(ostream &out, CPPScope *scope, bool parameter_names,
  211. int num_default_parameters) const {
  212. if (!_parameters.empty()) {
  213. for (int i = 0; i < (int)_parameters.size(); ++i) {
  214. if (i != 0) {
  215. out << ", ";
  216. }
  217. // Save the default value expression; we might be about to
  218. // temporarily clear it.
  219. CPPExpression *expr = _parameters[i]->_initializer;
  220. if (num_default_parameters >= 0 &&
  221. i < (int)_parameters.size() - num_default_parameters) {
  222. // Don't show the default value for this parameter.
  223. _parameters[i]->_initializer = (CPPExpression *)NULL;
  224. }
  225. if (parameter_names) {
  226. _parameters[i]->output(out, 0, scope, false);
  227. } else {
  228. _parameters[i]->_type->output(out, 0, scope, false);
  229. }
  230. // Restore the default value expression.
  231. _parameters[i]->_initializer = expr;
  232. }
  233. if (_includes_ellipsis) {
  234. out << ", ...";
  235. }
  236. } else if (_includes_ellipsis) {
  237. out << "...";
  238. } else {
  239. // No parameters.
  240. out << "void";
  241. }
  242. }