Beispiel #1
0
 void Marshaller::marshal(Object* obj) {
   if(obj == Qnil) {
     stream << "n" << endl;
   } else if(obj == Qtrue) {
     stream << "t" << endl;
   } else if(obj == Qfalse) {
     stream << "f" << endl;
   } else if(obj->fixnum_p()) {
     set_int(obj);
   } else if(obj->symbol_p()) {
     set_symbol((Symbol*)obj);
   } else if(kind_of<Bignum>(obj)) {
     set_bignum(as<Bignum>(obj));
   } else if(kind_of<String>(obj)) {
     set_string(as<String>(obj));
   } else if(kind_of<SendSite>(obj)) {
     set_sendsite(as<SendSite>(obj));
   } else if(kind_of<Array>(obj)) {
     set_array(as<Array>(obj));
   } else if(kind_of<Tuple>(obj)) {
     set_tuple(as<Tuple>(obj));
   } else if(kind_of<Float>(obj)) {
     set_float(as<Float>(obj));
   } else if(kind_of<InstructionSequence>(obj)) {
     set_iseq(as<InstructionSequence>(obj));
   } else if(kind_of<CompiledMethod>(obj)) {
     set_cmethod(as<CompiledMethod>(obj));
   } else {
     Exception::type_error(state, "unknown object");
   }
 }
Beispiel #2
0
std::tuple<aku_Status, size_t> SeriesOrderAggregateMaterializer::read(u8 *dest, size_t dest_size) {
    aku_Status status = AKU_ENO_DATA;
    size_t ressz = 0;  // current size
    size_t accsz = 0;  // accumulated size
    size_t sample_size = get_tuple_size(tuple_);
    size_t size = dest_size / sample_size;
    std::vector<aku_Timestamp> destts_vec(size, 0);
    std::vector<AggregationResult> destval_vec(size, INIT_AGGRES);
    std::vector<aku_ParamId> outids(size, 0);
    aku_Timestamp* destts = destts_vec.data();
    AggregationResult* destval = destval_vec.data();
    while(pos_ < iters_.size()) {
        aku_ParamId curr = ids_[pos_];
        std::tie(status, ressz) = iters_[pos_]->read(destts, destval, size);
        for (size_t i = accsz; i < accsz+ressz; i++) {
            outids[i] = curr;
        }
        destts += ressz;
        destval += ressz;
        size -= ressz;
        accsz += ressz;
        if (size == 0) {
            break;
        }
        pos_++;
        if (status == AKU_ENO_DATA) {
            // this iterator is done, continue with next
            continue;
        }
        if (status != AKU_SUCCESS) {
            // Stop iteration on error!
            break;
        }
    }
    // Convert vectors to series of samples
    for (size_t i = 0; i < accsz; i++) {
        double* tup;
        aku_Sample* sample;
        std::tie(sample, tup)   = cast(dest);
        dest                   += sample_size;
        sample->payload.type    = AKU_PAYLOAD_TUPLE|aku_PData::REGULLAR;
        sample->payload.size    = static_cast<u16>(sample_size);
        sample->paramid         = outids[i];
        sample->timestamp       = destts_vec[i];
        sample->payload.float64 = get_flags(tuple_);
        set_tuple(tup, tuple_, destval_vec[i]);
    }
    return std::make_tuple(status, accsz*sample_size);

}