#!/usr/bin/env python3

import sys
from enum import Enum

class Mode(Enum):
    TMP = "tmp"
    REFL = "refl"

assert(len(sys.argv) == 3)
num_structs = int(sys.argv[1])
print(f"// num structs {num_structs}\n")
assert(sys.argv[2] == "--tmp" or sys.argv[2] == "--refl")

mode = Mode.TMP if sys.argv[2] == "--tmp" else Mode.REFL

print("#include <type_traits>\n")
print("using namespace std;\n")

for i in range(num_structs):
    struct_name = f"S{i:04d}"
    print(f"struct {struct_name} {{")
    print("    int a_;")
    print("};\n")
    
if mode == Mode.TMP:
    print("void check() {");
    for i in range(num_structs):    
        for j in range(num_structs):
           if i!=j:
               print(f"  static_assert(!is_same_v<S{i:04d}, S{j:04d}>);")
           else:
               print(f"  static_assert( is_same_v<S{i:04d}, S{j:04d}>);")
    print("};\n")
else:
    print("void check_refl() {");
    for i in range(num_structs):    
        for j in range(num_structs):
           if i!=j:
               print(f"  static_assert(^^S{i:04d} != ^^S{j:04d});")
           else:
               print(f"  static_assert(^^S{i:04d} == ^^S{j:04d});")           
    print("};\n")

print("int main() {");

print("}")
           

    
        
