#include <iostream>
#include <type_traits>
#include <random>

#include "func.h"

void NoRefFoo(Counter x) {
    std::cout << "No ref func: " << x << '\n';
}

void RefFoo(const Counter& x) {
    std::cout << "Ref func: " << x << '\n';
}

int main() {
    static_assert(sizeof(Counter) <= 8);
    int x = 0;
    Counter w(x);
    int n; std::cin >> n;
    srand(n);
    static_assert(!std::is_invocable_v<decltype(NoRefFoo), Counter>);
    
    static_assert(std::is_invocable_v<decltype(RefFoo), Counter>);
    
    static_assert(std::is_invocable_v<decltype(RefFoo), const Counter&>);
    
    std::cout << "All static assertions passed!\n";
    RefFoo(w);
    x = 19;
    int cnt;
    do {
        cnt = abs(rand()) % 20; 
    } while(cnt == 0);
    for (size_t i = 0; i < cnt; ++i) {
        std::cout << w << '\n';
    }
    std::cout << w << '\n';
    x = 38;
    std::cout << w << '\n';    
    return 0;
}