void UmlBaseUseCaseDiagramDefinition::read_()
{
    QHash<void*,UmlUseCaseReference*> ucrefs;
    unsigned n;
    unsigned rank;

    n = UmlCom::read_unsigned();
    _fragments.resize(n);

    for (rank = 0; rank != n; rank += 1) {
        UmlFragment * f = new UmlFragment();

        _fragments.insert(rank, f);
        f->read_();
    }

    //_fragments.setAutoDelete(TRUE);
    UmlBaseFragment::compute_container_(_fragments);

    n = UmlCom::read_unsigned();
    _subjects.resize(n);

    for (rank = 0; rank != n; rank += 1) {
        UmlSubject * sb = new UmlSubject();

        _subjects.insert(rank, sb);
        sb->read_();
    }

    //_subjects.setAutoDelete(TRUE);

    n = UmlCom::read_unsigned();
    _use_cases.resize(n);

    for (rank = 0; rank != n; rank += 1) {
        UmlUseCaseReference * uc = new UmlUseCaseReference();

        _use_cases.insert(rank, uc);
        ucrefs.insert(reinterpret_cast<void*>(uintptr_t(UmlCom::read_unsigned())), uc);
        uc->read_(_fragments, _subjects);
    }

   // _use_cases.setAutoDelete(TRUE);

    n = UmlCom::read_unsigned();
    _actors.resize(n);

    for (rank = 0; rank != n; rank += 1)
        _actors.insert(rank, (UmlClass *) UmlBaseItem::read_());

    n = UmlCom::read_unsigned();
    _rels.resize(n);

    for (rank = 0; rank != n; rank += 1) {
        UmlUseCaseAssociation * r = new UmlUseCaseAssociation();

        _rels.insert(rank, r);
        r->read_(ucrefs);
    }

    //_rels.setAutoDelete(TRUE);
}
void UmlBaseSequenceDiagramDefinition::read_()
{
    QHash<void*,UmlClassInstanceReference*> instances;
    unsigned n;
    unsigned rank;

    n = UmlCom::read_unsigned();
    _fragments.resize(n);

    for (rank = 0; rank != n; rank += 1) {
        UmlFragment * f = new UmlFragment();

        _fragments.insert(rank, f);
        f->read_();
    }

    //_fragments.setAutoDelete(TRUE);
    UmlBaseFragment::compute_container_(_fragments);

    n = UmlCom::read_unsigned();
    _instances.resize(n);

    for (rank = 0; rank != n; rank += 1) {
        UmlClassInstanceReference * i = new UmlClassInstanceReference();

        _instances.insert(rank, i);
        instances.insert((void *) UmlCom::read_unsigned(), i);
        i->read_();
    }

    //_instances.setAutoDelete(TRUE);

    n = UmlCom::read_unsigned();
    _messages.resize(n);

    if (n != 0) {
        for (rank = 0; rank != n; rank += 1) {
            UmlSequenceMessage * m = new UmlSequenceMessage();

            _messages.insert(rank, m);
            m->read_(instances, _fragments);
        }

        ::qsort(_messages.data(), 0, n - 1);
        //_messages.setAutoDelete(TRUE);
    }

    n = _fragments.count();

    for (rank = 0; rank != n; rank += 1)
        _fragments.at(rank)->read_covered_(instances);


    while (UmlCom::read_bool()) {
        WrapperStr s = UmlCom::read_string();
        int x = (int) UmlCom::read_unsigned();
        int y = (int) UmlCom::read_unsigned();
        int w = (int) UmlCom::read_unsigned();
        int h = (int) UmlCom::read_unsigned();
        UmlFragmentCompartment * cp = UmlBaseFragment::get_container_(x, y, w, h, _fragments);

        if (cp != 0) cp->add_text_(s);
    }

    while (UmlCom::read_bool()) {
        WrapperStr s = UmlCom::read_string();
        int x = (int) UmlCom::read_unsigned();
        int y = (int) UmlCom::read_unsigned();
        int w = (int) UmlCom::read_unsigned();
        int h = (int) UmlCom::read_unsigned();
        UmlFragmentCompartment * cp = UmlBaseFragment::get_container_(x, y, w, h, _fragments);

        if (cp != 0) cp->add_cont_(s, y + h / 2);
    }
}