#define NDEBUG
#include <iostream>
#include <vector>
#include <utility>
// AOO = At Or Operator[]
#ifndef NDEBUG
#define AOO(INDEX) .at(INDEX)
#else
#define AOO(INDEX) [INDEX]
#endif
void testNormalUse()
{
std::vector<int> vec(100);
vec AOO(50) = 5;
std::cout << vec AOO(50) << std::endl;
}
void testRequireConst()
{
const std::vector<int> vec(100, 5);
std::cout << vec AOO(50) << std::endl;
}
void testRvalueRef()
{
std::vector<int>vec(100, 5);
std::cout << std::move(vec) AOO(50) << std::endl;
}
void test2d()
{
std::vector<std::vector<int>> vec(100, std::vector<int>(100, 5));
std::cout << vec AOO(50) AOO(50) << std::endl;
}
int main() {
testNormalUse();
testRequireConst();
testRvalueRef();
test2d();
}
I2RlZmluZSBOREVCVUcKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHV0aWxpdHk+CgovLyBBT08gPSBBdCBPciBPcGVyYXRvcltdCiNpZm5kZWYgTkRFQlVHCiAgI2RlZmluZSBBT08oSU5ERVgpIC5hdChJTkRFWCkKI2Vsc2UKICAjZGVmaW5lIEFPTyhJTkRFWCkgW0lOREVYXQojZW5kaWYKCnZvaWQgdGVzdE5vcm1hbFVzZSgpCnsKCXN0ZDo6dmVjdG9yPGludD4gdmVjKDEwMCk7Cgl2ZWMgQU9PKDUwKSA9IDU7CglzdGQ6OmNvdXQgPDwgdmVjIEFPTyg1MCkgPDwgc3RkOjplbmRsOwp9Cgp2b2lkIHRlc3RSZXF1aXJlQ29uc3QoKQp7Cgljb25zdCBzdGQ6OnZlY3RvcjxpbnQ+IHZlYygxMDAsIDUpOwoJc3RkOjpjb3V0IDw8IHZlYyBBT08oNTApIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCB0ZXN0UnZhbHVlUmVmKCkKewoJc3RkOjp2ZWN0b3I8aW50PnZlYygxMDAsIDUpOwoJc3RkOjpjb3V0IDw8IHN0ZDo6bW92ZSh2ZWMpIEFPTyg1MCkgPDwgc3RkOjplbmRsOwp9Cgp2b2lkIHRlc3QyZCgpCnsKCXN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IHZlYygxMDAsIHN0ZDo6dmVjdG9yPGludD4oMTAwLCA1KSk7CglzdGQ6OmNvdXQgPDwgdmVjIEFPTyg1MCkgQU9PKDUwKSA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewoJdGVzdE5vcm1hbFVzZSgpOwoJdGVzdFJlcXVpcmVDb25zdCgpOwoJdGVzdFJ2YWx1ZVJlZigpOwoJdGVzdDJkKCk7Cn0=