inline bool Carrier::set_and_merge(std::atomic<Ob>& destin, Ob source) const { POMAGMA_ASSERT_RANGE_(5, source, item_dim()); Ob old = 0; while (not destin.compare_exchange_strong( old, source, std::memory_order_acq_rel, std::memory_order_acquire)) { source = ensure_equal(source, old); if (old == source) return false; } return old == 0; }
inline bool Carrier::set_or_merge(std::atomic<Ob>& destin, Ob source) const { POMAGMA_ASSERT_RANGE_(5, source, item_dim()); Ob old = 0; if (destin.compare_exchange_strong(old, source, std::memory_order_acq_rel, std::memory_order_acquire)) { return true; } else { ensure_equal(source, old); return false; } }
void execute (const AssumeTask & task) { POMAGMA_DEBUG("assume " << task.expression); InsertParser parser(signature); parser.begin(task.expression); std::string type = parser.parse_token(); Ob lhs = parser.parse_term(); Ob rhs = parser.parse_term(); parser.end(); if (type == "EQUAL") { ensure_equal(lhs, rhs); } else if (type == "LESS") { ensure_less(lhs, rhs); } else if (type == "NLESS") { ensure_nless(lhs, rhs); } else { POMAGMA_ERROR("bad relation type: " << type); } }