#pragma once #include #include #include #include #include #include namespace aoc2019 { template inline std::from_chars_result from_chars(std::string_view str, T &value) { return std::from_chars(str.data(), str.data() + str.size(), value); } template void combine_hash(std::size_t &seed, const T &o) { // Algorithm taken from boost::combine_hash. std::hash hash{}; seed ^= hash(o) + 0x9e3779b9 + (seed << 6) + (seed >> 2); } std::string_view strtok(std::string_view &str, char token = ','); std::vector read_intcode(std::istream &input); std::vector run_intcode(std::vector &program, std::deque inputs = {}); class IntCodeComputer { public: typedef std::int64_t value_t; explicit IntCodeComputer(std::vector program, std::deque initial_inputs = {}); void run(); void connectOutput(IntCodeComputer &computer); void connectOutput(std::deque &sink); void sendInput(value_t input); [[nodiscard]] bool isTerminated() const; [[nodiscard]] const std::deque ¤tInputs() const; static std::vector read_intcode(std::istream &input); private: std::vector program; std::deque inputs = {}; std::deque *outputSink = nullptr; int ip = 0; int relative = 0; bool halted = false; [[nodiscard]] value_t &interpret_value(int pos); }; }