/* * Copyright (c) 2016 The WebM project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef TEST_SNAPSHOT_H_ #define TEST_SNAPSHOT_H_ #include namespace libvpx_test { /** * Allows capturing and retrieving snapshots of arbitrary blobs of memory, * blob size is based on compile time type information. * * Usage: * void example() { * Snapshot snapshot; * * int foo = 4; * * snapshot(foo); * * foo = 10; * * assert(snapshot.get(foo) == 4); // Pass * assert(snapshot.get(foo) == foo); // Fail (4 != 10) * * char bar[10][10]; * memset(bar, 3, sizeof(bar)); * * snapshot(bar); * * memset(bar, 8, sizeof(bar)); * * assert(sum(bar) == 800); // Pass * assert(sum(snapshot.get(bar)) == 300); // Pass * } */ class Snapshot { public: virtual ~Snapshot() { for (snapshot_map_t::iterator it = snapshots_.begin(); it != snapshots_.end(); it++) { delete[] it->second; } } /** * Take new snapshot for object */ template void take(const E &e) { const void *const key = reinterpret_cast(&e); snapshot_map_t::iterator it = snapshots_.find(key); if (it != snapshots_.end()) delete[] it->second; char *const buf = new char[sizeof(E)]; memcpy(buf, &e, sizeof(E)); snapshots_[key] = buf; } /** * Same as 'take' */ template void operator()(const E &e) { take(e); } /** * Retrieve last snapshot for object */ template const E& get(const E &e) const { const void *const key = reinterpret_cast(&e); snapshot_map_t::const_iterator it = snapshots_.find(key); assert(it != snapshots_.end()); return *reinterpret_cast(it->second); } private: typedef std::map snapshot_map_t; snapshot_map_t snapshots_; }; } // namespace libvpx_test #endif // TEST_SNAPSHOT_H_