extends c

priority 1

snippet enum "Enumeration"
enum ${1:name} {
	$0
};
endsnippet

snippet for "For loop, index or range"
for (${1:auto} ${2:index} ${4/(.*;.*)|(\w*)/(?1:=:\:)/} ${4:${3:0}; $2 < ${5:count}; $2${6:++}}) {
	$0
}
endsnippet

snippet struct "Structure"
struct ${1:name} {
	$0
};
endsnippet

snippet class "Class"
class ${1:name} {
 public:
	${1/(\w+)\s.*/$1/}();

	~${1/(\w+)\s.*/$1/}();

	$0
};
endsnippet

snippet template "Template"
template <class ${1:T}$2>$0
endsnippet

snippet namespace "Named or anonymous namespace"
namespace $1${1/(\w+)/ /}{
$0
}  // namespace${1/(\w*)/(?1: $1:)/}
endsnippet

snippet const_cast "Const cast" i
const_cast<$1>($2)$0
endsnippet

snippet dynamic_cast "Dynamic cast" i
dynamic_cast<$1>($2)$0
endsnippet

snippet static_cast "Static cast" i
static_cast<$1>($2)$0
endsnippet

snippet reinterpret_cast "Reinterpret case" i
reinterpret_cast<$1>($2)$0
endsnippet

snippet [] "Labmda function" i
[$1]($2)${3/(.*)/(?1: -> ::)/}$3 {$0}
endsnippet

snippet static_assert "Static assert"
static_assert($1, "$2");
endsnippet

snippet noisy "A noise class"
class noisy_t {
 public:
	noisy_t() { puts(__PRETTY_FUNCTION__); }
	noisy_t(const noisy_t &) { puts(__PRETTY_FUNCTION__); }
	noisy_t(noisy_t &&) { puts(__PRETTY_FUNCTION__); }
	noisy_t &operator=(const noisy_t &) { puts(__PRETTY_FUNCTION__); return *this; }
	noisy_t &operator=(noisy_t &&) { puts(__PRETTY_FUNCTION__); return *this; }
	~noisy_t() { puts(__PRETTY_FUNCTION__); }
};
endsnippet

snippet std::enable_if "Enable if"
typename std::enable_if<${1:condition}${2:, ${3:type}}>::type
endsnippet

snippet std::fprintf "std::fprintf ..."
std::fprintf(${1:stderr}, "${2:%s}\n"${2/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$3${2/([^%]|%%)*(%.)?.*/(?2:\);)/}
endsnippet

snippet std::printf "std::printf ..."
std::printf("${1:%s}\n"${1/([^%]|%%)*(%.)?.*/(?2:, :\);)/}$2${1/([^%]|%%)*(%.)?.*/(?2:\);)/}
endsnippet

snippet printf_sv "printf for std::string_view"
printf("$1: %.*s\n", static_cast<int>(${1:view}.size()), $1.data());$0
endsnippet

snippet externc "extern C block"
#ifdef __cplusplus
extern "C" {
#endif

$0

#ifdef __cplusplus
}
#endif
endsnippet