Value Iterator::Prod(Environment &env) { Signal &sig = env.GetSignal(); Value value; if (!Next(env, value)) return Value::Nil; if (!value.Is_number()) { const Operator *pOperatorMul = env.GetOperator(OPTYPE_Mul); Value valResult(value); while (Next(env, value)) { valResult = pOperatorMul->EvalBinary(env, valResult, value, FLAG_None); if (sig.IsSignalled()) return Value::Nil; } return valResult; } Number result = value.GetNumber(); while (Next(env, value)) { if (value.Is_number()) { if (result == 0) break; result *= value.GetNumber(); } else { const Operator *pOperatorMul = env.GetOperator(OPTYPE_Mul); Value valResult(result); do { valResult = pOperatorMul->EvalBinary(env, valResult, value, FLAG_None); if (sig.IsSignalled()) return Value::Nil; } while (Next(env, value)); return valResult; } } return Value(result); }
TEST(Protocol, McResultSerialize) { { McResult codeResult(R_DELETED); std::string result; StringWBuffer buffer(3, &result); codeResult.Serialize(&buffer); buffer.Flush(); ASSERT_EQ(result, "DELETED\r\n"); } { McResult errResult("Length of key is too long"); std::string result; StringWBuffer buffer(3, &result); errResult.Serialize(&buffer); buffer.Flush(); ASSERT_EQ(result, "ERROR Length of key is too long\r\n"); } { McValue value1("user_123", 1445128601, std::vector<char>({'1', '2', '3', '4', '5', 'a'})); McValue value2("user_876", 1446128601, std::vector<char>({'6', '7', '8', '9', '0', 'z'})); McResult valResult(std::vector<McValue>({value1, value2})); std::string result; StringWBuffer buffer(3, &result); valResult.Serialize(&buffer); buffer.Flush(); ASSERT_EQ(result, "user_123 1445128601 6\r\n12345a\r\nuser_876 1446128601 6\r\n67890z\r\nEND\r\n"); } }
Value Iterator::Sum(Environment &env, size_t &cnt) { Signal &sig = env.GetSignal(); cnt = 0; Value value; if (!Next(env, value)) return Value::Nil; if (!value.Is_number()) { const Operator *pOperatorAdd = env.GetOperator(OPTYPE_Add); Value valResult(value); cnt = 1; while (Next(env, value)) { valResult = pOperatorAdd->EvalBinary(env, valResult, value, FLAG_None); cnt++; if (sig.IsSignalled()) return Value::Nil; } return valResult; } Number result = value.GetNumber(); cnt = 1; while (Next(env, value)) { if (value.Is_number()) { result += value.GetNumber(); cnt++; } else { const Operator *pOperatorAdd = env.GetOperator(OPTYPE_Add); Value valResult(result); do { valResult = pOperatorAdd->EvalBinary(env, valResult, value, FLAG_None); cnt++; if (sig.IsSignalled()) return Value::Nil; } while (Next(env, value)); return valResult; } } return Value(result); }