diff options
Diffstat (limited to '')
| -rw-r--r-- | MoonParser/ast.hpp | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/MoonParser/ast.hpp b/MoonParser/ast.hpp index 63dccba..480f9b3 100644 --- a/MoonParser/ast.hpp +++ b/MoonParser/ast.hpp | |||
| @@ -230,13 +230,19 @@ public: | |||
| 230 | return static_cast<T*>(m_ptr); | 230 | return static_cast<T*>(m_ptr); |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | template <class T> | ||
| 234 | bool is() const { | ||
| 235 | return m_ptr->get_type() == ast_type<T>(); | ||
| 236 | } | ||
| 237 | |||
| 233 | void set(ast_node* node) { | 238 | void set(ast_node* node) { |
| 234 | if (node == m_ptr) return; | 239 | if (node == m_ptr) { |
| 235 | else if (!node) { | 240 | return; |
| 241 | } else if (!node) { | ||
| 236 | if (m_ptr) m_ptr->release(); | 242 | if (m_ptr) m_ptr->release(); |
| 237 | m_ptr = nullptr; | 243 | m_ptr = nullptr; |
| 238 | } | 244 | } else { |
| 239 | else if (accept(node)) { | 245 | assert(accept(node)); |
| 240 | if (m_ptr) m_ptr->release(); | 246 | if (m_ptr) m_ptr->release(); |
| 241 | m_ptr = node; | 247 | m_ptr = node; |
| 242 | node->retain(); | 248 | node->retain(); |
| @@ -383,33 +389,29 @@ public: | |||
| 383 | } | 389 | } |
| 384 | 390 | ||
| 385 | void push_back(ast_node* node) { | 391 | void push_back(ast_node* node) { |
| 386 | if (accept(node)) { | 392 | assert(node && accept(node)); |
| 387 | m_objects.push_back(node); | 393 | m_objects.push_back(node); |
| 388 | node->retain(); | 394 | node->retain(); |
| 389 | } | ||
| 390 | } | 395 | } |
| 391 | 396 | ||
| 392 | void push_front(ast_node* node) { | 397 | void push_front(ast_node* node) { |
| 393 | if (accept(node)) { | 398 | assert(node && accept(node)); |
| 394 | m_objects.push_front(node); | 399 | m_objects.push_front(node); |
| 395 | node->retain(); | 400 | node->retain(); |
| 396 | } | ||
| 397 | } | 401 | } |
| 398 | 402 | ||
| 399 | void set_front(ast_node* node) { | 403 | void set_front(ast_node* node) { |
| 400 | if (accept(node)) { | 404 | assert(node && accept(node)); |
| 401 | m_objects.front()->release(); | 405 | m_objects.front()->release(); |
| 402 | m_objects.front() = node; | 406 | m_objects.front() = node; |
| 403 | node->retain(); | 407 | node->retain(); |
| 404 | } | ||
| 405 | } | 408 | } |
| 406 | 409 | ||
| 407 | void set_back(ast_node* node) { | 410 | void set_back(ast_node* node) { |
| 408 | if (accept(node)) { | 411 | assert(node && accept(node)); |
| 409 | m_objects.back()->release(); | 412 | m_objects.back()->release(); |
| 410 | m_objects.back() = node; | 413 | m_objects.back() = node; |
| 411 | node->retain(); | 414 | node->retain(); |
| 412 | } | ||
| 413 | } | 415 | } |
| 414 | 416 | ||
| 415 | const container& objects() const { | 417 | const container& objects() const { |
