Re[18]: Собеседования в Яндекс++
От: smeeld  
Дата: 05.06.19 00:57
Оценка:
Здравствуйте, so5team, Вы писали:

Вот вам ещё кусок кода.
db_ngine::statement db_engine::evaluate_statement(const db_context &ctx)
{
    while (_node != nstore().end_nodes() &&
           (_node->node()->type().stage() <= ctx.stage() || skip_run(*_node->node(), ctx))){
        db_statement * const first_ok = eval_node(*_node, ctx) ;
        if (first_ok){
            const unsigned ndx = first_ok->_ndx ;
            PCHECK(ndx < nstore().section_count) ;
            PCHECK(first_ok < _first_ok || code().section_count > 1 || !*(nstore().begin_done() + ndx)) ;
            const ASTB &ast = first_ok->parser_s() ;
            if (ast.attributes() & ASTB::STAGE){
                PCHECK(ast.converter().type().need_request()) ;
                if (first_ok < _first_rstage)
                    _first_rstage = first_ok ;
            }
            if (!(ast.attributes() & ASTB::NEXT)){
                *(nstore().begin_done() + ndx) = &ast ;
                if(nstore().section_count>1)
                    for(db_statement *s=first_ok; s<nstore().end_statements(); ++s)
                        if(s && s->root()->is_evaluated() && s->root()->value()) 
                            if(s->_ndx!=ndx){      
                                const ASTB **ptr=nstore().begin_done()+s->_ndx;
                                if(!*ptr || *ptr>&s->parser_s()) 
                                    *ptr=&s->parser_s();
                                   *ptr=&s->parser_s();
                            }
                db_section *cursection = nstore().begin_sections() + ndx ;
                db_statement *secbegin = nstore().begin_statements() + cursection[0].start ;
                db_statement *secend = nstore().begin_statements() + cursection[1].start ;
                PCHECK(db::xinrange(first_ok, secbegin, secend)) ;
                for (db_statement *reduced = first_ok < _first_ok || first_ok == secbegin
                         ? first_ok + 1
                         : secbegin ;
                     reduced != secend ; ++reduced)

                    if (!reduced->root()->is_done())
                    {
                        mark_done(*reduced->root()) ;
                        reduce_tree(*reduced->root()) ;
                    }

                if (first_ok < _first_ok)
                    _first_ok = first_ok ;
            }
        }

        do if (++_start_node == nstore().end_nodes())
           {
               *std::remove(nstore().begin_done(), nstore().end_done(), nullptr) = nullptr ;
               break ;
           }
        while (_start_done->is_idle()) ;
    }
    ......
Отредактировано 05.06.2019 1:12 smeeld . Предыдущая версия . Еще …
Отредактировано 05.06.2019 1:11 smeeld . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.