Skip to content

Instantly share code, notes, and snippets.

@lo48576
Last active June 27, 2017 09:35
Show Gist options
  • Select an option

  • Save lo48576/f4bb7a2958bd3ca0f9eb to your computer and use it in GitHub Desktop.

Select an option

Save lo48576/f4bb7a2958bd3ca0f9eb to your computer and use it in GitHub Desktop.
macroli
/*
* Copyright 2015-2017 YOSHIOKA Takuma
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/*!
* \file macroli.h
* \brief Macro to use SGR easily.
* \author YOSHIOKA Takuma <tashioka.256@gmail.com>
* \date 2015-2017
*/
// NO PRAGMA ONCE!!!
#ifndef INCLUDED__NU11P0__MACROLI_H_
#define INCLUDED__NU11P0__MACROLI_H_
//
// fundamental (internal)
//
# define MACROLI__CAT(a, b) a ## b
# define MACROLI__CAT2(a, b) MACROLI__CAT(a, b)
# define MACROLI__SECOND(a, b, ...) b
# define MACROLI__CALL_SECOND(...) MACROLI__SECOND(__VA_ARGS__,,)
# define MACROLI__EMPTY()
# define MACROLI__EVAL1(...) __VA_ARGS__
# define MACROLI__EVAL2(...) MACROLI__EVAL1(MACROLI__EVAL1(__VA_ARGS__))
# define MACROLI__EVAL4(...) MACROLI__EVAL2(MACROLI__EVAL2(__VA_ARGS__))
# define MACROLI__EVAL8(...) MACROLI__EVAL4(MACROLI__EVAL4(__VA_ARGS__))
# define MACROLI__EVAL16(...) MACROLI__EVAL8(MACROLI__EVAL8(__VA_ARGS__))
# define MACROLI__EVAL32(...) MACROLI__EVAL16(MACROLI__EVAL16(__VA_ARGS__))
# define MACROLI__EVAL64(...) MACROLI__EVAL32(MACROLI__EVAL32(__VA_ARGS__))
# define MACROLI__EVAL128(...) MACROLI__EVAL64(MACROLI__EVAL64(__VA_ARGS__))
# define MACROLI__DEFER3(m) m MACROLI__EMPTY MACROLI__EMPTY MACROLI__EMPTY()()()
# define MACROLI__IGNORE(...)
//
// fundamental (for user)
//
# define MACROLI_CAT(a, b) a ## b
# define MACROLI_STRINGIZE(x) #x
# define MACROLI_COMMA() ,
//
// MACROLI_SEQ
//
// Evaluated to `MACROLI__SEQ_CONCAT_` if more than two arguments are given,
// `MACROLI__IGNORE` if not.
# define MACROLI__SEQ_ARGCHECK(sep, proc, first, ...) MACROLI__CALL_SECOND(MACROLI__CAT(MACROLI__SEQ_ARGCHECK_, first), MACROLI__DEFER3(MACROLI__SEQ_CONCAT_)()) (sep, proc, first, __VA_ARGS__)
# define MACROLI__SEQ_ARGCHECK_ ~, MACROLI__IGNORE
# define MACROLI__SEQ(sep, proc, first, ...) proc(first) MACROLI__SEQ_ARGCHECK(sep, proc, __VA_ARGS__,)
# define MACROLI__SEQ_CONCAT(sep, proc, first, ...) sep proc(first) MACROLI__SEQ_ARGCHECK(sep, proc, __VA_ARGS__,)
# define MACROLI__SEQ_CONCAT_() MACROLI__SEQ_CONCAT
//
// usage:
// MACROLI_SEQ(sep, proc, a, b, c) => proc(a) sep proc(b) sep proc(c)
// This can be used as "map" function.
//
# define MACROLI_SEQ(sep, proc, ...) MACROLI__EVAL128(MACROLI__SEQ(sep, proc, __VA_ARGS__,))
//
// MACROLI_SEQF
//
// Evaluated to `MACROLI__SEQF_CONCAT_` if more than two arguments are given,
// `MACROLI__IGNORE` if not.
# define MACROLI__SEQF_ARGCHECK(sepf, proc, first, ...) MACROLI__CALL_SECOND(MACROLI__CAT(MACROLI__SEQF_ARGCHECK_, first), MACROLI__DEFER3(MACROLI__SEQF_CONCAT_)()) (sepf, proc, first, __VA_ARGS__)
# define MACROLI__SEQF_ARGCHECK_ ~, MACROLI__IGNORE
# define MACROLI__SEQF(sepf, proc, first, ...) proc(first) MACROLI__SEQF_ARGCHECK(sepf, proc, __VA_ARGS__,)
# define MACROLI__SEQF_CONCAT(sepf, proc, first, ...) sepf() proc(first) MACROLI__SEQF_ARGCHECK(sepf, proc, __VA_ARGS__,)
# define MACROLI__SEQF_CONCAT_() MACROLI__SEQF_CONCAT
//
// usage:
// MACROLI_SEQF(sepf, proc, a, b, c) => proc(a) sep() proc(b) sep() proc(c)
// This can be used as "map" function.
//
# define MACROLI_SEQF(sepf, proc, ...) MACROLI__EVAL128(MACROLI__SEQF(sepf, proc, __VA_ARGS__,))
#elif defined(MACROLI_UNDEF) // ifndef INCLUDED__NU11P0__MACROLI_H_
#undef MACROLI_UNDEF
#undef INCLUDED__NU11P0__MACROLI_H_
//
// fundamentals (internal)
//
#undef MACROLI__CAT
#undef MACROLI__CAT2
#undef MACROLI__SECOND
#undef MACROLI__CALL_SECOND
#undef MACROLI__EMPTY
#undef MACROLI__EVAL1
#undef MACROLI__EVAL2
#undef MACROLI__EVAL4
#undef MACROLI__EVAL8
#undef MACROLI__EVAL16
#undef MACROLI__EVAL32
#undef MACROLI__EVAL64
#undef MACROLI__EVAL128
#undef MACROLI__DEFER3
#undef MACROLI__IGNORE
//
// fundamental (for user)
//
#undef MACROLI_CAT
#undef MACROLI_STRINGIZE
#undef MACROLI_COMMA
//
// MACROLI_SEQ
//
#undef MACROLI__SEQ_ARGCHECK
#undef MACROLI__SEQ_ARGCHECK_
#undef MACROLI__SEQ
#undef MACROLI__SEQ_CONCAT
#undef MACROLI__SEQ_CONCAT_
#undef MACROLI_SEQ
//
// MACROLI_SEQF
//
#undef MACROLI__SEQF_ARGCHECK
#undef MACROLI__SEQF_ARGCHECK_
#undef MACROLI__SEQF
#undef MACROLI__SEQF_CONCAT
#undef MACROLI__SEQF_CONCAT_
#endif // ifndef INCLUDED__NU11P0__MACROLI_H_
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment