123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- #!/usr/bin/env python3
- # - * - encoding: UTF-8 - * -
- from argparse import ArgumentParser
- import random
- import sys
- import math
- def parse_args():
- parser = ArgumentParser(description="")
- parser.add_argument('--range', type=int)
- parser.add_argument('--enum', nargs=2, action="append", metavar=("NAME", "SIZE"))
- parser.add_argument('--namespace', type=str)
- args = parser.parse_args()
- return args
- def gen_enum(name, n):
- rg = random.Random(n)
- h1 = list(range(n))
- h2 = list(range(n))
- rg.shuffle(h1)
- rg.shuffle(h2)
- print("enum class %s {" % name)
- for k, v in zip(h1, h2):
- print(" V%x = 0x%04x," % (k, v))
- print("};")
- print()
- def main():
- args = parse_args()
- print("#pragma once\n\n")
- gr = {}
- for name, size in args.enum or []:
- assert name not in gr
- gr[name] = int(size)
- if args.range:
- step = max(int(math.sqrt(args.range)), 1)
- for s in range(args.range, -1, -step):
- gr["EDenseEnum%04d" % s] = s
- if args.namespace:
- print(f"namespace {args.namespace} {{")
- for name, size in sorted(gr.items(), key=lambda kv: -kv[1]):
- gen_enum(name, size)
- if args.namespace:
- print(f"}} // namespace {args.namespace}")
- return 0
- if __name__ == '__main__':
- sys.exit(main())
|