// #pragma once
#include
#include
#include
/////////
// type
/////////
#define GFLAGS_TYPE_bool bool
#define GFLAGS_TYPE_int32 gflags::int32
#define GFLAGS_TYPE_uint32 gflags::uint32
#define GFLAGS_TYPE_int64 gflags::int64
#define GFLAGS_TYPE_uint64 gflags::uint64
#define GFLAGS_TYPE_double double
#define GFLAGS_TYPE_string std::string
#define GFLAGS_TYPE(type) GFLAGS_TYPE_##type
////////////
// declare
////////////
#define DECLARE_each_variable(type, name) DECLARE_##type(name)
#define DECLARE_vector(type, name) \
DECLARE_each_variable(type, name##_0); \
DECLARE_each_variable(type, name##_1); \
DECLARE_each_variable(type, name##_2); \
DECLARE_each_variable(type, name##_3); \
DECLARE_each_variable(type, name##_4); \
DECLARE_each_variable(type, name##_5); \
DECLARE_each_variable(type, name##_6); \
DECLARE_each_variable(type, name##_7); \
DECLARE_each_variable(type, name##_8); \
DECLARE_each_variable(type, name##_9); \
const GFLAGS_TYPE(type)& FLAGS_VECTOR_##name(size_t);
#define DECLARE_bool_vector(name) DECLARE_vector(bool, name)
#define DECLARE_int32_vector(name) DECLARE_vector(int32, name)
#define DECLARE_uint32_vector(name) DECLARE_vector(uint32, name)
#define DECLARE_int64_vector(name) DECLARE_vector(int64, name)
#define DECLARE_uint64_vector(name) DECLARE_vector(uint64, name)
#define DECLARE_double_vector(name) DECLARE_vector(double, name)
#define DECLARE_string_vector(name) DECLARE_vector(string, name)
///////////
// define
///////////
#define DEFINE_each_variable(type, name, value, help) DEFINE_##type(name, value, help)
#define DEFINE_vector_getter(type, name) \
const GFLAGS_TYPE(type)& FLAGS_VECTOR_##name(size_t i) { \
switch(i) { \
case 0: return FLAGS_##name##_0; \
case 1: return FLAGS_##name##_1; \
case 2: return FLAGS_##name##_2; \
case 3: return FLAGS_##name##_3; \
case 4: return FLAGS_##name##_4; \
case 5: return FLAGS_##name##_5; \
case 6: return FLAGS_##name##_6; \
case 7: return FLAGS_##name##_7; \
case 8: return FLAGS_##name##_8; \
case 9: return FLAGS_##name##_9; \
} \
}
#define DEFINE_vector(type, name, value, help) \
DEFINE_each_variable(type, name##_0, value, help); \
DEFINE_each_variable(type, name##_1, value, help); \
DEFINE_each_variable(type, name##_2, value, help); \
DEFINE_each_variable(type, name##_3, value, help); \
DEFINE_each_variable(type, name##_4, value, help); \
DEFINE_each_variable(type, name##_5, value, help); \
DEFINE_each_variable(type, name##_6, value, help); \
DEFINE_each_variable(type, name##_7, value, help); \
DEFINE_each_variable(type, name##_8, value, help); \
DEFINE_each_variable(type, name##_9, value, help); \
DEFINE_vector_getter(type, name)
#define DEFINE_bool_vector(name, value, help) DEFINE_vector(bool, name, value, help)
#define DEFINE_int32_vector(name, value, help) DEFINE_vector(int32, name, value, help)
#define DEFINE_uint32_vector(name, value, help) DEFINE_vector(uint32, name, value, help)
#define DEFINE_int64_vector(name, value, help) DEFINE_vector(int64, name, value, help)
#define DEFINE_uint64_vector(name, value, help) DEFINE_vector(uint64, name, value, help)
#define DEFINE_double_vector(name, value, help) DEFINE_vector(double, name, value, help)
#define DEFINE_string_vector(name, value, help) DEFINE_vector(string, name, value, help)
//////////
// test
/////////
DEFINE_string_vector(message, "", "ddd");
int main(int argc, char** argv) {
// google::ParseCommandLineFlags(&argc, &argv, true);
FLAGS_message_0 = "hello";
FLAGS_message_1 = "world";
FLAGS_message_2 = "this";
FLAGS_message_3 = "is";
FLAGS_message_4 = "gflags";
int idx = 2;
std::cout << FLAGS_VECTOR_message(0) << std::endl;
std::cout << FLAGS_VECTOR_message(1) << std::endl;
std::cout << FLAGS_VECTOR_message(idx) << std::endl;
return 0;
}