| 37 | size_t CPUGenerator::GetStateSize() const { return sizeof(CPUGeneratorState); } |
| 38 | |
| 39 | void CPUGenerator::GetState(size_t state_size, void* state) const { |
| 40 | CHECK_EQ_OR_THROW(state_size, GetStateSize()) |
| 41 | << "state size of cpu generator should be equal to " << GetStateSize(); |
| 42 | CPUGeneratorState local_state; |
| 43 | std::stringstream ss; |
| 44 | ss << engine_; |
| 45 | std::vector<std::string> splits; |
| 46 | Split(ss.str(), " ", [&](std::string&& s) { splits.emplace_back(s); }); |
| 47 | // The last element in `splits` indicates state size, not state. |
| 48 | if (splits.size() != CPUGeneratorState::state_size + 1) { |
| 49 | return THROW(RuntimeError) << "std::mt19937 state size should be " |
| 50 | << CPUGeneratorState::state_size << ", but got " |
| 51 | << splits.size() - 1; |
| 52 | } |
| 53 | for (int i = 0; i < CPUGeneratorState::state_size; ++i) { |
| 54 | local_state.states[i] = std::atoll(splits[i].data()); |
| 55 | } |
| 56 | local_state.seed = current_seed(); |
| 57 | memcpy(state, &local_state, sizeof(CPUGeneratorState)); |
| 58 | } |
| 59 | |
| 60 | void CPUGenerator::SetState(size_t state_size, const void* state) { |
| 61 | CHECK_EQ_OR_THROW(state_size, GetStateSize()) |
nothing calls this directly
no test coverage detected