StackNode* StackTree::record() { static const int frames_to_capture = 256; void* stack[frames_to_capture]; USHORT captured_frames_count = CaptureStackBackTrace(2, frames_to_capture, stack, 0); void** ptr = stack + captured_frames_count - 1; if (!m_root) { m_root = new StackNode(); m_root->m_instruction = *ptr; m_root->m_first_child = nullptr; m_root->m_next = nullptr; m_root->m_parent = nullptr; --ptr; return insertChildren(m_root, ptr, stack); } StackNode* node = m_root; while (ptr >= stack) { while (node->m_instruction != *ptr && node->m_next) { node = node->m_next; } if (node->m_instruction != *ptr) { node->m_next = new StackNode; node->m_next->m_parent = node->m_parent; node->m_next->m_instruction = *ptr; node->m_next->m_next = nullptr; node->m_next->m_first_child = nullptr; --ptr; return insertChildren(node->m_next, ptr, stack); } else if (node->m_first_child) { --ptr; node = node->m_first_child; } else if (ptr != stack) { --ptr; return insertChildren(node, ptr, stack); } else { return node; } } return node; }
// Elements daeInt daeSTLDatabase::insertElement(daeDocument* document,daeElement* element) { insertChildren( document, element ); std::map<std::string, std::vector< daeElement* > >::iterator iter = elements.find( std::string( element->getTypeName() ) ); if ( iter != elements.end() ) { (*iter).second.push_back( element ); } else { std::vector< daeElement* > vec; vec.push_back( element ); elements.insert( std::make_pair( std::string( element->getTypeName() ), vec ) ); } //insert into IDMap if element has an ID. IDMap is used to speed up URI resolution if ( element->getID() != NULL ) { elementsIDMap.insert( std::make_pair( std::string( element->getID() ), element ) ); } return DAE_OK; }
bool ProjectPriceListParentItem::appendChildren( int count ) { return insertChildren( m_d->priceListContainer.size(), count ); }