bool SlamContextInterface::process(CommandNode* commandNode)
 {
   if (! _slam) {
     return true;
   }
   switch (commandNode->commandType()) {
     case CT_ADD_NODE:
       {
         AddNode* c = static_cast<AddNode*>(commandNode);
         return _slam->addNode(c->tag(), c->id(), c->dimension(), c->values());
       }
     case CT_ADD_EDGE:
       {
         AddEdge* c = static_cast<AddEdge*>(commandNode);
         return _slam->addEdge(c->tag(), c->id(), c->dimension(), c->id1(), c->id2(), c->values(), c->information());
       }
     case CT_SOLVE_STATE:
       {
         //SolveState* c = static_cast<SolveState*>(commandNode);
         return _slam->solveState();
       }
     case CT_QUERY_STATE:
       {
         QueryState* c = static_cast<QueryState*>(commandNode);
         return _slam->queryState(c->ids());
       }
     case CT_FIX:
       {
         FixNode* c = static_cast<FixNode*>(commandNode);
         return _slam->fixNode(c->ids());
       }
   }
   cerr << __PRETTY_FUNCTION__ << ": Unknown command type" << endl;
   return false;
 }
    R ColumnBase::aggregate(T target, std::size_t start, std::size_t end,
                            std::size_t limit, std::size_t* return_ndx) const
{

    condition cond;
    int c = condition::condition;
    typedef typename ColumnTypeTraits2<condition, T>::column_type ColType;
    typedef typename ColumnTypeTraits2<condition, T>::array_type ArrType;

    if (end == std::size_t(-1))
        end = size();

    QueryState<R> state;
    state.init(action, null_ptr, limit);

    ColType* column = const_cast<ColType*>(static_cast<const ColType*>(this));
    SequentialGetter<T> sg(column);

    bool cont = true;
    for (size_t s = start; cont && s < end; ) {
        sg.cache_next(s);
        size_t end2 = sg.local_end(end);

        if(util::SameType<T, int64_t>::value) {
            cont = (static_cast<const Array*>(sg.m_array_ptr))->find(c, action, int64_t(target), s - sg.m_leaf_start, end2, sg.m_leaf_start, reinterpret_cast<QueryState<int64_t>*>(&state));
        }
        else {
            for(size_t local_index = s - sg.m_leaf_start; cont && local_index < end2; local_index++) {
                T v = ((ArrType*)(sg.m_array_ptr))->get(local_index);
                if(cond(v, target)) {
                    cont = (static_cast<QueryState<R>*>(&state))->template match<action, false>(s + local_index , 0, static_cast<R>(v));
                }
            }
        }
        s = end2 + sg.m_leaf_start;
    }

    if (return_ndx)
        *return_ndx = state.m_minmax_index;

    return state.m_state;
}
Exemplo n.º 3
0
R aggregate(const ColType& column, T target, size_t start, size_t end,
            size_t limit, size_t* return_ndx)
{
    if (end == npos)
        end = column.size();

    QueryState<R> state;
    state.init(action, nullptr, limit);
    SequentialGetter<ColType> sg { &column };

    bool cont = true;
    for (size_t s = start; cont && s < end; ) {
        sg.cache_next(s);
        size_t start2 = s - sg.m_leaf_start;
        size_t end2 = sg.local_end(end);
        cont = _impl::FindInLeaf<ColType>::template find<action, Condition>(*sg.m_leaf_ptr, target, start2, end2, sg.m_leaf_start, state);
        s = sg.m_leaf_start + end2;
    }

    if (return_ndx)
        *return_ndx = state.m_minmax_index;

    return state.m_state;
}