Esempio n. 1
0
void ManagerArbre::add(Arbre &node)
{
    if(node.feuille())
    {
        if(node.parent())
        {
            Arbre parent(node.parent());
            get(parent);
            if(parent.feuille())
            {
                if(node.num())
                    throw std::invalid_argument("Le premier descendnat doit avoir un numéro nul.");
                else
                    ManagerSqlArbre::add(node);
                parent.setFeuille(false);
                ManagerSqlArbre::modify(parent);
            }
            else
            {
                int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
                if(node.num() < 0 || node.num() > max)
                {
                    node.setNum(max+1);
                    ManagerSqlArbre::add(node);
                }
                else
                {
                    ListPtr<Arbre> nodes(getList(Arbre::Parent,node.parent(),
                                                 Arbre::Num,node.num(),
                                                 Arbre::Num,
                                                 bdd::Condition::Egal,bdd::Condition::SupEgal,
                                                 false));
                    for(ListPtr<Arbre>::iterator i = nodes.begin(); i != nodes.end(); ++i)
                    {
                        (*i).setNum((*i).num() + 1);
                        ManagerSqlArbre::modify(*i);
                    }
                    ManagerSqlArbre::add(node);
                }
            }
        }
        else
        {
            if(node.num())
                throw std::invalid_argument("Une racine doit avoir un numéro nul.");
            else
                ManagerSqlArbre::add(node);
        }
    }
    else
        throw std::invalid_argument("Le nouveau noeud ajouté doit être une feuille.");
}
Esempio n. 2
0
void ManagerArbre::addUnstable(Arbre &node)
{
    if(node.feuille())
    {
        if(node.parent())
        {
            Arbre parent(node.parent());
            get(parent);
            if(parent.feuille())
            {
                if(node.num())
                    throw std::invalid_argument("Le premier descendnat doit avoir un numéro nul.");
                else
                    ManagerSqlArbre::add(node);
                parent.setFeuille(false);
                ManagerSqlArbre::modify(parent);
            }
            else
            {
                int max = fonctionAgrega<int>(bdd::Agrega::Max,Arbre::Num,Arbre::Parent,node.parent());
                if(node.num() < 0 || node.num() > max)
                {
                    node.setNum(max+1);
                    ManagerSqlArbre::add(node);
                }
                else
                {
                    deplace(node);
                    ManagerSqlArbre::add(node);
                }
            }
        }
        else
        {
            if(node.num())
                throw std::invalid_argument("Une racine doit avoir un numéro nul.");
            else
                ManagerSqlArbre::add(node);
        }
    }
    else
        throw std::invalid_argument("Le nouveau noeud ajouté doit être une feuille.");
}