// =============================================================== //
//                                                                 //
//   File      : AP_TreeSet.cxx                                    //
//   Purpose   : function for sets of tree nodes                   //
//                                                                 //
//   Coded by Ralf Westram (coder@reallysoft.de) in January 2017   //
//   http://www.arb-home.de/                                       //
//                                                                 //
// =============================================================== //

#include "AP_TreeSet.hxx"

using namespace std;

void collect_enclosing_groups(AP_tree *node, AP_tree_set& groups) {
    AP_tree *fnode = node->get_father();

    if (fnode && fnode->has_group_info() && !node->is_leaf() && node->is_keeled_group()) {
        // do NOT add direct parent group to 'groups' (it's me!)
        node  = fnode;
        fnode = node->get_father();
    }

    while (fnode) {
        if (fnode->has_group_info()) {
            const TreeNode *keeledSon = fnode->keelTarget();
            if (!keeledSon || keeledSon == node) {
                groups.insert(fnode);
            }
        }
        node  = fnode;
        fnode = node->get_father();
    }
}

void collect_contained_groups(AP_tree *node, AP_tree_set& groups) { // currently only used from testcode
    if (!node->is_leaf()) {
        if (node->has_group_info()) groups.insert(node);
        collect_contained_groups(node->get_leftson(), groups);
        collect_contained_groups(node->get_rightson(), groups);
    }
}
