except: add more explanatory comments

This commit is contained in:
Danny Robson 2017-09-09 13:44:24 +10:00
parent b2e1489762
commit d569113f8c

View File

@ -84,6 +84,17 @@ namespace cruft::vk {
} }
///--------------------------------------------------------------------
/// returns a container of values obtained from FuncT
///
/// FuncT must take arguments of the form:
/// ... FuncT (..., uint32_t *length, ResultT *values)
/// and must return the expected length when values is null.
///
/// the return type will be checked by try_code if it is a VkResult.
///
/// the container will dynamically size so that it can contain all
/// available values.
template < template <
template <typename...> class ContainerT = std::vector, template <typename...> class ContainerT = std::vector,
typename FuncT, typename FuncT,
@ -92,9 +103,12 @@ namespace cruft::vk {
static auto static auto
try_array (FuncT &&func, Args &&...args) try_array (FuncT &&func, Args &&...args)
{ {
// extract the number of elements available
uint32_t expected = 0; uint32_t expected = 0;
try_func (func, args..., &expected, nullptr); try_func (func, args..., &expected, nullptr);
// find the type of the last argument, ie. the values we're
// requesting
using ValueT = std::remove_pointer_t< using ValueT = std::remove_pointer_t<
std::tuple_element_t< std::tuple_element_t<
sizeof...(Args) + 1, sizeof...(Args) + 1,
@ -102,11 +116,17 @@ namespace cruft::vk {
> >
>; >;
// return the values on the stack temporarily as we may need to
// convert them to a seperate result type.
//
// TODO: remove this intermediate step where we don't actually
// have a conversion to do, ie ResultT == ValueT.
ValueT values[expected]; ValueT values[expected];
uint32_t found = expected; uint32_t found = expected;
try_func (func, args..., &found, &values[0]); try_func (func, args..., &found, &values[0]);
CHECK_EQ (expected, found); CHECK_EQ (expected, found);
// convert to the requested type
return ContainerT<ValueT> { return ContainerT<ValueT> {
&values[0], &values[0],
&values[found] &values[found]
@ -115,6 +135,7 @@ namespace cruft::vk {
}; };
//-------------------------------------------------------------------------
class invalid_argument : public error { class invalid_argument : public error {
public: public:
invalid_argument (const char *_what) noexcept: invalid_argument (const char *_what) noexcept:
@ -132,6 +153,7 @@ namespace cruft::vk {
}; };
//-------------------------------------------------------------------------
template <VkResult> template <VkResult>
class error_code : public error { class error_code : public error {
public: public: