Browse Source

Merge branch 'master' into compatibility

Vladimír Vondruš 13 years ago
parent
commit
9f89bce53c
  1. 1
      external/CMakeLists.txt
  2. 25
      external/Optional/CMakeLists.txt
  3. 23
      external/Optional/LICENSE_1_0.txt
  4. 943
      external/Optional/optional.hpp
  5. 3
      src/TextureTools/distance-field.cpp
  6. 59
      src/Trade/AbstractImporter.cpp
  7. 87
      src/Trade/AbstractImporter.h
  8. 7
      src/Trade/CameraData.h
  9. 7
      src/Trade/LightData.h

1
external/CMakeLists.txt vendored

@ -23,3 +23,4 @@
# #
add_subdirectory(OpenGL) add_subdirectory(OpenGL)
add_subdirectory(Optional)

25
external/Optional/CMakeLists.txt vendored

@ -0,0 +1,25 @@
#
# This file is part of Magnum.
#
# Copyright © 2010, 2011, 2012, 2013 Vladimír Vondruš <mosra@centrum.cz>
#
# 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.
#
install(FILES optional.hpp DESTINATION ${MAGNUM_INCLUDE_INSTALL_DIR}/Optional)

23
external/Optional/LICENSE_1_0.txt vendored

@ -0,0 +1,23 @@
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
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, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

943
external/Optional/optional.hpp vendored

@ -0,0 +1,943 @@
// Copyright (C) 2011 - 2012 Andrzej Krzemienski.
//
// Use, modification, and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// The idea and interface is based on Boost.Optional library
// authored by Fernando Luis Cacciola Carballal
# ifndef ___OPTIONAL_HPP___
# define ___OPTIONAL_HPP___
# include <utility>
# include <type_traits>
# include <initializer_list>
# include <cassert>
# include <functional>
# include <string>
# include <stdexcept>
# define REQUIRES(...) typename enable_if<__VA_ARGS__::value, bool>::type = false
# if defined __clang__
# define OPTIONAL_HAS_USING 1
# if (__clang_major__ > 2) || (__clang_major__ == 2) && (__clang_minor__ >= 9)
# define OPTIONAL_HAS_THIS_RVALUE_REFS 1
# else
# define OPTIONAL_HAS_THIS_RVALUE_REFS 0
# endif
# elif defined __GNUC__
# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))
# define OPTIONAL_HAS_USING 1
# else
# define OPTIONAL_HAS_USING 0
# endif
# if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 8 || ((__GNUC_MINOR__ == 8) && (__GNUC_PATCHLEVEL__ >= 1))))
# define OPTIONAL_HAS_THIS_RVALUE_REFS 1
# else
# define OPTIONAL_HAS_THIS_RVALUE_REFS 0
# endif
# else
# define OPTIONAL_HAS_THIS_RVALUE_REFS 0
# define OPTIONAL_HAS_USING 0
# endif
namespace std{
# if (defined __GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)))
// leave it; our metafunctions are already defined.
# elif (defined __clang__) && ((__clang_major__ > 3) || (__clang_major__ == 3) && (__clang_minor__ >= 3))
// leave it; our metafunctions are already defined.
# else
# if OPTIONAL_HAS_USING
// the only bit GCC 4.7 and clang 3.2 don't have
template <class T>
using is_trivially_destructible = typename std::has_trivial_destructor<T>;
# endif
# if (defined __GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)))
// leave it; remaining metafunctions are already defined.
# elif defined __clang__
// leave it; remaining metafunctions are already defined.
# else
// workaround for missing traits in GCC and CLANG
template <class T>
struct is_nothrow_move_constructible
{
constexpr static bool value = std::is_nothrow_constructible<T, T&&>::value;
};
template <class T, class U>
struct is_assignable
{
template <class X, class Y>
static constexpr bool has_assign(...) { return false; }
template <class X, class Y, size_t S = sizeof(std::declval<X>() = std::declval<Y>()) >
static constexpr bool has_assign(bool) { return true; }
constexpr static bool value = has_assign<T, U>(true);
};
template <class T>
struct is_nothrow_move_assignable
{
template <class X, bool has_any_move_massign>
struct has_nothrow_move_assign {
constexpr static bool value = false;
};
template <class X>
struct has_nothrow_move_assign<X, true> {
constexpr static bool value = noexcept( std::declval<X&>() = std::declval<X&&>() );
};
constexpr static bool value = has_nothrow_move_assign<T, is_assignable<T&, T&&>::value>::value;
};
// end workaround
# endif // not as good as GCC 4.7
# endif // not as good as GCC 4.8
// 20.5.4, optional for object types
template <class T> class optional;
// 20.5.5, optional for lvalue reference types
template <class T> class optional<T&>;
// workaround: std utility functions aren't constexpr yet
template <class T> inline constexpr T&& constexpr_forward(typename std::remove_reference<T>::type& t) noexcept
{
return static_cast<T&&>(t);
}
template <class T> inline constexpr T&& constexpr_forward(typename std::remove_reference<T>::type&& t) noexcept
{
static_assert(!std::is_lvalue_reference<T>::value, "!!");
return static_cast<T&&>(t);
}
template <class T> inline constexpr typename std::remove_reference<T>::type&& constexpr_move(T&& t) noexcept
{
return static_cast<typename std::remove_reference<T>::type&&>(t);
}
#if defined NDEBUG
# define ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR)
#else
# define ASSERTED_EXPRESSION(CHECK, EXPR) ((CHECK) ? (EXPR) : (fail(#CHECK, __FILE__, __LINE__), (EXPR)))
inline void fail(const char* expr, const char* file, unsigned line)
{
# if defined __clang__ || defined __GNU_LIBRARY__
__assert(expr, file, line);
# elif defined __GNUC__
_assert(expr, file, line);
# else
# error UNSUPPORTED COMPILER
# endif
}
#endif
template <typename T>
struct has_overloaded_addressof
{
template <class X>
static constexpr bool has_overload(...) { return false; }
template <class X, size_t S = sizeof(std::declval< X&>().operator&()) >
static constexpr bool has_overload(bool) { return true; }
constexpr static bool value = has_overload<T>(true);
};
template <typename T, REQUIRES(!has_overloaded_addressof<T>)>
constexpr T* static_addressof(T& ref)
{
return &ref;
}
template <typename T, REQUIRES(has_overloaded_addressof<T>)>
T* static_addressof(T& ref)
{
return std::addressof(ref);
}
template <class U>
struct is_not_optional
{
constexpr static bool value = true;
};
template <class T>
struct is_not_optional<optional<T>>
{
constexpr static bool value = false;
};
constexpr struct trivial_init_t{} trivial_init{};
// 20.5.6, In-place construction
constexpr struct in_place_t{} in_place{};
// 20.5.7, Disengaged state indicator
struct nullopt_t
{
struct init{};
constexpr nullopt_t(init){};
};
constexpr nullopt_t nullopt{nullopt_t::init{}};
// 20.5.8, class bad_optional_access
class bad_optional_access : public logic_error {
public:
explicit bad_optional_access(const string& what_arg) : logic_error{what_arg} {}
explicit bad_optional_access(const char* what_arg) : logic_error{what_arg} {}
};
template <class T>
union storage_t
{
unsigned char dummy_;
T value_;
constexpr storage_t( trivial_init_t ) noexcept : dummy_() {};
template <class... Args>
constexpr storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {}
~storage_t(){}
};
template <class T>
union constexpr_storage_t
{
unsigned char dummy_;
T value_;
constexpr constexpr_storage_t( trivial_init_t ) noexcept : dummy_() {};
template <class... Args>
constexpr constexpr_storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {}
~constexpr_storage_t() = default;
};
constexpr struct only_set_initialized_t{} only_set_initialized{};
template <class T>
struct optional_base
{
bool init_;
storage_t<T> storage_;
constexpr optional_base() noexcept : init_(false), storage_(trivial_init) {};
constexpr explicit optional_base(only_set_initialized_t, bool init) noexcept : init_(init), storage_(trivial_init) {};
explicit constexpr optional_base(const T& v) : init_(true), storage_(v) {}
explicit constexpr optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {}
template <class... Args> explicit optional_base(in_place_t, Args&&... args)
: init_(true), storage_(constexpr_forward<Args>(args)...) {}
template <class U, class... Args, REQUIRES(is_constructible<T, std::initializer_list<U>>)>
explicit optional_base(in_place_t, std::initializer_list<U> il, Args&&... args)
: init_(true), storage_(il, std::forward<Args>(args)...) {}
~optional_base() { if (init_) storage_.value_.T::~T(); }
};
template <class T>
struct constexpr_optional_base
{
bool init_;
constexpr_storage_t<T> storage_;
constexpr constexpr_optional_base() noexcept : init_(false), storage_(trivial_init) {};
constexpr explicit constexpr_optional_base(only_set_initialized_t, bool init) noexcept : init_(init), storage_(trivial_init) {};
explicit constexpr constexpr_optional_base(const T& v) : init_(true), storage_(v) {}
explicit constexpr constexpr_optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {}
template <class... Args> explicit constexpr constexpr_optional_base(in_place_t, Args&&... args)
: init_(true), storage_(constexpr_forward<Args>(args)...) {}
template <class U, class... Args, REQUIRES(is_constructible<T, std::initializer_list<U>>)>
explicit constexpr_optional_base(in_place_t, std::initializer_list<U> il, Args&&... args)
: init_(true), storage_(il, std::forward<Args>(args)...) {}
~constexpr_optional_base() = default;
};
# if OPTIONAL_HAS_USING
template <class T>
using OptionalBase = typename std::conditional<
std::is_trivially_destructible<T>::value,
constexpr_optional_base<T>,
optional_base<T>
>::type;
# else
# define OptionalBase optional_base
# endif
template <class T>
class optional : private OptionalBase<T>
{
static_assert( !std::is_same<typename std::decay<T>::type, nullopt_t>::value, "bad T" );
static_assert( !std::is_same<typename std::decay<T>::type, in_place_t>::value, "bad T" );
constexpr bool initialized() const noexcept { return OptionalBase<T>::init_; }
T* dataptr() { return std::addressof(OptionalBase<T>::storage_.value_); }
constexpr const T* dataptr() const { return static_addressof(OptionalBase<T>::storage_.value_); }
# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1
constexpr const T& contained_val() const& { return OptionalBase<T>::storage_.value_; }
T& contained_val() & { return OptionalBase<T>::storage_.value_; }
T&& contained_val() && { return std::move(OptionalBase<T>::storage_.value_); }
# else
constexpr const T& contained_val() const { return OptionalBase<T>::storage_.value_; }
T& contained_val() { return OptionalBase<T>::storage_.value_; }
# endif
void clear() noexcept {
if (initialized()) dataptr()->T::~T();
OptionalBase<T>::init_ = false;
}
template <class... Args>
void initialize(Args&&... args) noexcept(noexcept(T(std::forward<Args>(args)...)))
{
assert(!OptionalBase<T>::init_);
new (dataptr()) T(std::forward<Args>(args)...);
OptionalBase<T>::init_ = true;
}
template <class U, class... Args>
void initialize(std::initializer_list<U> il, Args&&... args) noexcept(noexcept(T(il, std::forward<Args>(args)...)))
{
assert(!OptionalBase<T>::init_);
new (dataptr()) T(il, std::forward<Args>(args)...);
OptionalBase<T>::init_ = true;
}
public:
typedef T value_type;
// 20.5.5.1, constructors
constexpr optional() noexcept : OptionalBase<T>() {};
constexpr optional(nullopt_t) noexcept : OptionalBase<T>() {};
optional(const optional& rhs)
: OptionalBase<T>(only_set_initialized, rhs.initialized())
{
if (rhs.initialized()) new (dataptr()) T(*rhs);
}
optional(optional&& rhs) noexcept(std::is_nothrow_move_constructible<T>::value)
: OptionalBase<T>(only_set_initialized, rhs.initialized())
{
if (rhs.initialized()) new (dataptr()) T(std::move(*rhs));
}
constexpr optional(const T& v) : OptionalBase<T>(v) {}
constexpr optional(T&& v) : OptionalBase<T>(constexpr_move(v)) {}
template <class... Args>
constexpr explicit optional(in_place_t, Args&&... args)
: OptionalBase<T>(in_place_t{}, constexpr_forward<Args>(args)...) {}
template <class U, class... Args, REQUIRES(is_constructible<T, std::initializer_list<U>>)>
explicit optional(in_place_t, std::initializer_list<U> il, Args&&... args)
: OptionalBase<T>(in_place_t{}, il, constexpr_forward<Args>(args)...) {}
// 20.5.4.2 Destructor
~optional() = default;
// 20.5.4.3, assignment
optional& operator=(nullopt_t) noexcept
{
clear();
return *this;
}
optional& operator=(const optional& rhs)
{
if (initialized() == true && rhs.initialized() == false) clear();
else if (initialized() == false && rhs.initialized() == true) initialize(*rhs);
else if (initialized() == true && rhs.initialized() == true) contained_val() = *rhs;
return *this;
}
optional& operator=(optional&& rhs)
noexcept(std::is_nothrow_move_assignable<T>::value && std::is_nothrow_move_constructible<T>::value)
{
if (initialized() == true && rhs.initialized() == false) clear();
else if (initialized() == false && rhs.initialized() == true) initialize(std::move(*rhs));
else if (initialized() == true && rhs.initialized() == true) contained_val() = std::move(*rhs);
return *this;
}
template <class U>
auto operator=(U&& v)
-> typename enable_if
<
is_same<typename remove_reference<U>::type, T>::value,
optional&
>::type
{
if (initialized()) { contained_val() = std::forward<U>(v); }
else { initialize(std::forward<U>(v)); }
return *this;
}
template <class... Args>
void emplace(Args&&... args)
{
clear();
initialize(std::forward<Args>(args)...);
}
template <class U, class... Args>
void emplace(initializer_list<U> il, Args&&... args)
{
clear();
initialize<U, Args...>(il, std::forward<Args>(args)...);
}
// 20.5.4.4 Swap
void swap(optional<T>& rhs) noexcept(is_nothrow_move_constructible<T>::value && noexcept(swap(declval<T&>(), declval<T&>())))
{
if (initialized() == true && rhs.initialized() == false) { rhs.initialize(std::move(**this)); clear(); }
else if (initialized() == false && rhs.initialized() == true) { initialize(std::move(*rhs)); rhs.clear(); }
else if (initialized() == true && rhs.initialized() == true) { using std::swap; swap(**this, *rhs); }
}
// 20.5.4.5 Observers
constexpr T const* operator ->() const {
return ASSERTED_EXPRESSION(initialized(), dataptr());
}
T* operator ->() {
assert (initialized());
return dataptr();
}
constexpr T const& operator *() const {
return ASSERTED_EXPRESSION(initialized(), contained_val());
}
T& operator *() {
assert (initialized());
return contained_val();
}
constexpr T const& value() const {
return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val());
}
T& value() {
return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val());
}
constexpr explicit operator bool() const noexcept { return initialized(); }
# if OPTIONAL_HAS_THIS_RVALUE_REFS == 1
template <class V>
constexpr T value_or(V&& v) const&
{
return *this ? **this : static_cast<T>(constexpr_forward<V>(v));
}
template <class V>
T value_or(V&& v) &&
{
return *this ? std::move(const_cast<optional<T>&>(*this).contained_val()) : static_cast<T>(constexpr_forward<V>(v));
}
# else
template <class V>
constexpr T value_or(V&& v) const
{
return *this ? **this : static_cast<T>(constexpr_forward<V>(v));
}
# endif
};
template <class T>
class optional<T&>
{
static_assert( !std::is_same<T, nullopt_t>::value, "bad T" );
static_assert( !std::is_same<T, in_place_t>::value, "bad T" );
T* ref;
public:
// 20.5.5.1, construction/destruction
constexpr optional() noexcept : ref(nullptr) {}
constexpr optional(nullopt_t) noexcept : ref(nullptr) {}
constexpr optional(T& v) noexcept : ref(static_addressof(v)) {}
optional(T&&) = delete;
constexpr optional(const optional& rhs) noexcept : ref(rhs.ref) {}
explicit constexpr optional(in_place_t, T& v) noexcept : ref(static_addressof(v)) {}
explicit optional(in_place_t, T&&) = delete;
~optional() = default;
// 20.5.5.2, mutation
optional& operator=(nullopt_t) noexcept {
ref = nullptr;
return *this;
}
// optional& operator=(const optional& rhs) noexcept {
// ref = rhs.ref;
// return *this;
// }
// optional& operator=(optional&& rhs) noexcept {
// ref = rhs.ref;
// return *this;
// }
template <typename U>
auto operator=(U&& rhs) noexcept
-> typename enable_if
<
is_same<typename decay<U>::type, optional<T&>>::value,
optional&
>::type
{
ref = rhs.ref;
return *this;
}
template <typename U>
auto operator=(U&& rhs) noexcept
-> typename enable_if
<
!is_same<typename decay<U>::type, optional<T&>>::value,
optional&
>::type
= delete;
void emplace(T& v) noexcept {
ref = static_addressof(v);
}
void emplace(T&&) = delete;
void swap(optional<T&>& rhs) noexcept
{
std::swap(ref, rhs.ref);
}
// 20.5.5.3, observers
constexpr T* operator->() const {
return ASSERTED_EXPRESSION(ref, ref);
}
constexpr T& operator*() const {
return ASSERTED_EXPRESSION(ref, *ref);
}
constexpr T& value() const {
return ref ? *ref : (throw bad_optional_access("bad optional access"), *ref);
}
explicit constexpr operator bool() const noexcept {
return ref != nullptr;
}
template <class V>
constexpr typename decay<T>::type value_or(V&& v) const
{
return *this ? **this : static_cast<typename decay<T>::type>(constexpr_forward<V>(v));
}
};
template <class T>
class optional<T&&>
{
static_assert( sizeof(T) == 0, "optional rvalue referencs disallowed" );
};
// 20.5.8, Relational operators
template <class T> constexpr bool operator==(const optional<T>& x, const optional<T>& y)
{
return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y;
}
template <class T> constexpr bool operator!=(const optional<T>& x, const optional<T>& y)
{
return !(x == y);
}
template <class T> constexpr bool operator<(const optional<T>& x, const optional<T>& y)
{
return (!y) ? false : (!x) ? true : *x < *y;
}
template <class T> constexpr bool operator>(const optional<T>& x, const optional<T>& y)
{
return (y < x);
}
template <class T> constexpr bool operator<=(const optional<T>& x, const optional<T>& y)
{
return !(y < x);
}
template <class T> constexpr bool operator>=(const optional<T>& x, const optional<T>& y)
{
return !(x < y);
}
// 20.5.9 Comparison with nullopt
template <class T> constexpr bool operator==(const optional<T>& x, nullopt_t) noexcept
{
return (!x);
}
template <class T> constexpr bool operator==(nullopt_t, const optional<T>& x) noexcept
{
return (!x);
}
template <class T> constexpr bool operator!=(const optional<T>& x, nullopt_t) noexcept
{
return bool(x);
}
template <class T> constexpr bool operator!=(nullopt_t, const optional<T>& x) noexcept
{
return bool(x);
}
template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept
{
return false;
}
template <class T> constexpr bool operator<(nullopt_t, const optional<T>& x) noexcept
{
return bool(x);
}
template <class T> constexpr bool operator<=(const optional<T>& x, nullopt_t) noexcept
{
return (!x);
}
template <class T> constexpr bool operator<=(nullopt_t, const optional<T>&) noexcept
{
return true;
}
template <class T> constexpr bool operator>(const optional<T>& x, nullopt_t) noexcept
{
return bool(x);
}
template <class T> constexpr bool operator>(nullopt_t, const optional<T>&) noexcept
{
return false;
}
template <class T> constexpr bool operator>=(const optional<T>&, nullopt_t) noexcept
{
return true;
}
template <class T> constexpr bool operator>=(nullopt_t, const optional<T>& x) noexcept
{
return (!x);
}
// 20.5.10, Comparison with T
template <class T> constexpr bool operator==(const optional<T>& x, const T& v)
{
return bool(x) ? *x == v : false;
}
template <class T> constexpr bool operator==(const T& v, const optional<T>& x)
{
return bool(x) ? v == *x : false;
}
template <class T> constexpr bool operator!=(const optional<T>& x, const T& v)
{
return bool(x) ? *x != v : true;
}
template <class T> constexpr bool operator!=(const T& v, const optional<T>& x)
{
return bool(x) ? v != *x : true;
}
template <class T> constexpr bool operator<(const optional<T>& x, const T& v)
{
return bool(x) ? *x < v : true;
}
template <class T> constexpr bool operator>(const T& v, const optional<T>& x)
{
return bool(x) ? v > *x : true;
}
template <class T> constexpr bool operator>(const optional<T>& x, const T& v)
{
return bool(x) ? *x > v : false;
}
template <class T> constexpr bool operator<(const T& v, const optional<T>& x)
{
return bool(x) ? v < *x : false;
}
template <class T> constexpr bool operator>=(const optional<T>& x, const T& v)
{
return bool(x) ? *x >= v : false;
}
template <class T> constexpr bool operator<=(const T& v, const optional<T>& x)
{
return bool(x) ? v <= *x : false;
}
template <class T> constexpr bool operator<=(const optional<T>& x, const T& v)
{
return bool(x) ? *x <= v : true;
}
template <class T> constexpr bool operator>=(const T& v, const optional<T>& x)
{
return bool(x) ? v >= *x : true;
}
// Comparison of optionsl<T&> with T
template <class T> constexpr bool operator==(const optional<T&>& x, const T& v)
{
return bool(x) ? *x == v : false;
}
template <class T> constexpr bool operator==(const T& v, const optional<T&>& x)
{
return bool(x) ? v == *x : false;
}
template <class T> constexpr bool operator!=(const optional<T&>& x, const T& v)
{
return bool(x) ? *x != v : true;
}
template <class T> constexpr bool operator!=(const T& v, const optional<T&>& x)
{
return bool(x) ? v != *x : true;
}
template <class T> constexpr bool operator<(const optional<T&>& x, const T& v)
{
return bool(x) ? *x < v : true;
}
template <class T> constexpr bool operator>(const T& v, const optional<T&>& x)
{
return bool(x) ? v > *x : true;
}
template <class T> constexpr bool operator>(const optional<T&>& x, const T& v)
{
return bool(x) ? *x > v : false;
}
template <class T> constexpr bool operator<(const T& v, const optional<T&>& x)
{
return bool(x) ? v < *x : false;
}
template <class T> constexpr bool operator>=(const optional<T&>& x, const T& v)
{
return bool(x) ? *x >= v : false;
}
template <class T> constexpr bool operator<=(const T& v, const optional<T&>& x)
{
return bool(x) ? v <= *x : false;
}
template <class T> constexpr bool operator<=(const optional<T&>& x, const T& v)
{
return bool(x) ? *x <= v : true;
}
template <class T> constexpr bool operator>=(const T& v, const optional<T&>& x)
{
return bool(x) ? v >= *x : true;
}
// Comparison of optionsl<T const&> with T
template <class T> constexpr bool operator==(const optional<const T&>& x, const T& v)
{
return bool(x) ? *x == v : false;
}
template <class T> constexpr bool operator==(const T& v, const optional<const T&>& x)
{
return bool(x) ? v == *x : false;
}
template <class T> constexpr bool operator!=(const optional<const T&>& x, const T& v)
{
return bool(x) ? *x != v : true;
}
template <class T> constexpr bool operator!=(const T& v, const optional<const T&>& x)
{
return bool(x) ? v != *x : true;
}
template <class T> constexpr bool operator<(const optional<const T&>& x, const T& v)
{
return bool(x) ? *x < v : true;
}
template <class T> constexpr bool operator>(const T& v, const optional<const T&>& x)
{
return bool(x) ? v > *x : true;
}
template <class T> constexpr bool operator>(const optional<const T&>& x, const T& v)
{
return bool(x) ? *x > v : false;
}
template <class T> constexpr bool operator<(const T& v, const optional<const T&>& x)
{
return bool(x) ? v < *x : false;
}
template <class T> constexpr bool operator>=(const optional<const T&>& x, const T& v)
{
return bool(x) ? *x >= v : false;
}
template <class T> constexpr bool operator<=(const T& v, const optional<const T&>& x)
{
return bool(x) ? v <= *x : false;
}
template <class T> constexpr bool operator<=(const optional<const T&>& x, const T& v)
{
return bool(x) ? *x <= v : true;
}
template <class T> constexpr bool operator>=(const T& v, const optional<const T&>& x)
{
return bool(x) ? v >= *x : true;
}
// 20.5.12 Specialized algorithms
template <class T>
void swap(optional<T>& x, optional<T>& y) noexcept(noexcept(x.swap(y)))
{
x.swap(y);
}
template <class T>
constexpr optional<typename decay<T>::type> make_optional(T&& v)
{
return optional<typename decay<T>::type>(constexpr_forward<T>(v));
}
template <class X>
constexpr optional<X&> make_optional(reference_wrapper<X> v)
{
return optional<X&>(v.get());
}
} // namespace std
namespace std
{
template <typename T>
struct hash<std::optional<T>>
{
typedef typename hash<T>::result_type result_type;
typedef std::optional<T> argument_type;
constexpr result_type operator()(argument_type const& arg) const {
return arg ? std::hash<T>{}(*arg) : result_type{};
}
};
template <typename T>
struct hash<std::optional<T&>>
{
typedef typename hash<T>::result_type result_type;
typedef std::optional<T&> argument_type;
constexpr result_type operator()(argument_type const& arg) const {
return arg ? std::hash<T>{}(*arg) : result_type{};
}
};
}
#ifdef OptionalBase
# undef OptionalBase
#endif
# endif //___OPTIONAL_HPP___

3
src/TextureTools/distance-field.cpp

@ -83,7 +83,7 @@ int DistanceFieldConverter::exec() {
CORRADE_INTERNAL_ASSERT(importer && converter); CORRADE_INTERNAL_ASSERT(importer && converter);
/* Open input file */ /* Open input file */
Trade::ImageData2D* image = nullptr; std::optional<Trade::ImageData2D> image;
if(!importer->openFile(args.value("input")) || !(image = importer->image2D(0))) { if(!importer->openFile(args.value("input")) || !(image = importer->image2D(0))) {
Error() << "Cannot open file" << args.value("input"); Error() << "Cannot open file" << args.value("input");
delete importer; delete importer;
@ -114,7 +114,6 @@ int DistanceFieldConverter::exec() {
/* Do it */ /* Do it */
Debug() << "Converting image of size" << image->size() << "to distance field..."; Debug() << "Converting image of size" << image->size() << "to distance field...";
TextureTools::distanceField(input, output, {{}, args.value<Vector2i>("output-size")}, args.value<Int>("radius"), image->size()); TextureTools::distanceField(input, output, {{}, args.value<Vector2i>("output-size")}, args.value<Int>("radius"), image->size());
delete image;
/* Save image */ /* Save image */
Image2D result(ImageFormat::Red, ImageType::UnsignedByte); Image2D result(ImageFormat::Red, ImageType::UnsignedByte);

59
src/Trade/AbstractImporter.cpp

@ -28,6 +28,17 @@
#include <Containers/Array.h> #include <Containers/Array.h>
#include <Utility/Assert.h> #include <Utility/Assert.h>
#include "Trade/AbstractMaterialData.h"
#include "Trade/CameraData.h"
#include "Trade/ImageData.h"
#include "Trade/LightData.h"
#include "Trade/MeshData2D.h"
#include "Trade/MeshData3D.h"
#include "Trade/ObjectData2D.h"
#include "Trade/ObjectData3D.h"
#include "Trade/SceneData.h"
#include "Trade/TextureData.h"
namespace Magnum { namespace Trade { namespace Magnum { namespace Trade {
AbstractImporter::AbstractImporter() = default; AbstractImporter::AbstractImporter() = default;
@ -111,13 +122,13 @@ std::string AbstractImporter::sceneName(const UnsignedInt id) {
std::string AbstractImporter::doSceneName(UnsignedInt) { return {}; } std::string AbstractImporter::doSceneName(UnsignedInt) { return {}; }
SceneData* AbstractImporter::scene(const UnsignedInt id) { std::optional<SceneData> AbstractImporter::scene(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::scene(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::scene(): no file opened", {});
CORRADE_ASSERT(id < doSceneCount(), "Trade::AbstractImporter::scene(): index out of range", {}); CORRADE_ASSERT(id < doSceneCount(), "Trade::AbstractImporter::scene(): index out of range", {});
return doScene(id); return doScene(id);
} }
SceneData* AbstractImporter::doScene(UnsignedInt) { return nullptr; } std::optional<SceneData> AbstractImporter::doScene(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::lightCount() const { UnsignedInt AbstractImporter::lightCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::lightCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::lightCount(): no file opened", {});
@ -141,13 +152,13 @@ std::string AbstractImporter::lightName(const UnsignedInt id) {
std::string AbstractImporter::doLightName(UnsignedInt) { return {}; } std::string AbstractImporter::doLightName(UnsignedInt) { return {}; }
LightData* AbstractImporter::light(const UnsignedInt id) { std::optional<LightData> AbstractImporter::light(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::light(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::light(): no file opened", {});
CORRADE_ASSERT(id < doLightCount(), "Trade::AbstractImporter::light(): index out of range", {}); CORRADE_ASSERT(id < doLightCount(), "Trade::AbstractImporter::light(): index out of range", {});
return doLight(id); return doLight(id);
} }
LightData* AbstractImporter::doLight(UnsignedInt) { return nullptr; } std::optional<LightData> AbstractImporter::doLight(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::cameraCount() const { UnsignedInt AbstractImporter::cameraCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::cameraCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::cameraCount(): no file opened", {});
@ -171,13 +182,13 @@ std::string AbstractImporter::cameraName(const UnsignedInt id) {
std::string AbstractImporter::doCameraName(UnsignedInt) { return {}; } std::string AbstractImporter::doCameraName(UnsignedInt) { return {}; }
CameraData* AbstractImporter::camera(const UnsignedInt id) { std::optional<CameraData> AbstractImporter::camera(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::camera(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::camera(): no file opened", {});
CORRADE_ASSERT(id < doCameraCount(), "Trade::AbstractImporter::camera(): index out of range", {}); CORRADE_ASSERT(id < doCameraCount(), "Trade::AbstractImporter::camera(): index out of range", {});
return doCamera(id); return doCamera(id);
} }
CameraData* AbstractImporter::doCamera(UnsignedInt) { return nullptr; } std::optional<CameraData> AbstractImporter::doCamera(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::object2DCount() const { UnsignedInt AbstractImporter::object2DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object2DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object2DCount(): no file opened", {});
@ -201,13 +212,13 @@ std::string AbstractImporter::object2DName(const UnsignedInt id) {
std::string AbstractImporter::doObject2DName(UnsignedInt) { return {}; } std::string AbstractImporter::doObject2DName(UnsignedInt) { return {}; }
ObjectData2D* AbstractImporter::object2D(const UnsignedInt id) { std::unique_ptr<ObjectData2D> AbstractImporter::object2D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object2D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object2D(): no file opened", {});
CORRADE_ASSERT(id < doObject2DCount(), "Trade::AbstractImporter::object2D(): index out of range", {}); CORRADE_ASSERT(id < doObject2DCount(), "Trade::AbstractImporter::object2D(): index out of range", {});
return doObject2D(id); return doObject2D(id);
} }
ObjectData2D* AbstractImporter::doObject2D(UnsignedInt) { return nullptr; } std::unique_ptr<ObjectData2D> AbstractImporter::doObject2D(UnsignedInt) { return nullptr; }
UnsignedInt AbstractImporter::object3DCount() const { UnsignedInt AbstractImporter::object3DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object3DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object3DCount(): no file opened", {});
@ -231,13 +242,13 @@ std::string AbstractImporter::object3DName(const UnsignedInt id) {
std::string AbstractImporter::doObject3DName(UnsignedInt) { return {}; } std::string AbstractImporter::doObject3DName(UnsignedInt) { return {}; }
ObjectData3D* AbstractImporter::object3D(const UnsignedInt id) { std::unique_ptr<ObjectData3D> AbstractImporter::object3D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object3D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::object3D(): no file opened", {});
CORRADE_ASSERT(id < doObject3DCount(), "Trade::AbstractImporter::object3D(): index out of range", {}); CORRADE_ASSERT(id < doObject3DCount(), "Trade::AbstractImporter::object3D(): index out of range", {});
return doObject3D(id); return doObject3D(id);
} }
ObjectData3D* AbstractImporter::doObject3D(UnsignedInt) { return nullptr; } std::unique_ptr<ObjectData3D> AbstractImporter::doObject3D(UnsignedInt) { return nullptr; }
UnsignedInt AbstractImporter::mesh2DCount() const { UnsignedInt AbstractImporter::mesh2DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh2DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh2DCount(): no file opened", {});
@ -261,13 +272,13 @@ std::string AbstractImporter::mesh2DName(const UnsignedInt id) {
std::string AbstractImporter::doMesh2DName(UnsignedInt) { return {}; } std::string AbstractImporter::doMesh2DName(UnsignedInt) { return {}; }
MeshData2D* AbstractImporter::mesh2D(const UnsignedInt id) { std::optional<MeshData2D> AbstractImporter::mesh2D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh2D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh2D(): no file opened", {});
CORRADE_ASSERT(id < doMesh2DCount(), "Trade::AbstractImporter::object2D(): index out of range", {}); CORRADE_ASSERT(id < doMesh2DCount(), "Trade::AbstractImporter::object2D(): index out of range", {});
return doMesh2D(id); return doMesh2D(id);
} }
MeshData2D* AbstractImporter::doMesh2D(UnsignedInt) { return nullptr; } std::optional<MeshData2D> AbstractImporter::doMesh2D(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::mesh3DCount() const { UnsignedInt AbstractImporter::mesh3DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh3DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh3DCount(): no file opened", {});
@ -291,13 +302,13 @@ std::string AbstractImporter::mesh3DName(const UnsignedInt id) {
std::string AbstractImporter::doMesh3DName(UnsignedInt) { return {}; } std::string AbstractImporter::doMesh3DName(UnsignedInt) { return {}; }
MeshData3D* AbstractImporter::mesh3D(const UnsignedInt id) { std::optional<MeshData3D> AbstractImporter::mesh3D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh3D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh3D(): no file opened", {});
CORRADE_ASSERT(id < doMesh3DCount(), "Trade::AbstractImporter::mesh3D(): index out of range", {}); CORRADE_ASSERT(id < doMesh3DCount(), "Trade::AbstractImporter::mesh3D(): index out of range", {});
return doMesh3D(id); return doMesh3D(id);
} }
MeshData3D* AbstractImporter::doMesh3D(UnsignedInt) { return nullptr; } std::optional<MeshData3D> AbstractImporter::doMesh3D(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::materialCount() const { UnsignedInt AbstractImporter::materialCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::materialCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::materialCount(): no file opened", {});
@ -321,13 +332,13 @@ std::string AbstractImporter::materialName(const UnsignedInt id) {
std::string AbstractImporter::doMaterialName(UnsignedInt) { return {}; } std::string AbstractImporter::doMaterialName(UnsignedInt) { return {}; }
AbstractMaterialData* AbstractImporter::material(const UnsignedInt id) { std::unique_ptr<AbstractMaterialData> AbstractImporter::material(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::material(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::material(): no file opened", {});
CORRADE_ASSERT(id < doMaterialCount(), "Trade::AbstractImporter::material(): index out of range", {}); CORRADE_ASSERT(id < doMaterialCount(), "Trade::AbstractImporter::material(): index out of range", {});
return doMaterial(id); return doMaterial(id);
} }
AbstractMaterialData* AbstractImporter::doMaterial(UnsignedInt) { return nullptr; } std::unique_ptr<AbstractMaterialData> AbstractImporter::doMaterial(UnsignedInt) { return nullptr; }
UnsignedInt AbstractImporter::textureCount() const { UnsignedInt AbstractImporter::textureCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::textureCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::textureCount(): no file opened", {});
@ -351,13 +362,13 @@ std::string AbstractImporter::textureName(const UnsignedInt id) {
std::string AbstractImporter::doTextureName(UnsignedInt) { return {}; } std::string AbstractImporter::doTextureName(UnsignedInt) { return {}; }
TextureData* AbstractImporter::texture(const UnsignedInt id) { std::optional<TextureData> AbstractImporter::texture(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::texture(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::texture(): no file opened", {});
CORRADE_ASSERT(id < doTextureCount(), "Trade::AbstractImporter::texture(): index out of range", {}); CORRADE_ASSERT(id < doTextureCount(), "Trade::AbstractImporter::texture(): index out of range", {});
return doTexture(id); return doTexture(id);
} }
TextureData* AbstractImporter::doTexture(UnsignedInt) { return nullptr; } std::optional<TextureData> AbstractImporter::doTexture(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::image1DCount() const { UnsignedInt AbstractImporter::image1DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1DCount(): no file opened", {});
@ -381,13 +392,13 @@ std::string AbstractImporter::image1DName(const UnsignedInt id) {
std::string AbstractImporter::doImage1DName(UnsignedInt) { return {}; } std::string AbstractImporter::doImage1DName(UnsignedInt) { return {}; }
ImageData1D* AbstractImporter::image1D(const UnsignedInt id) { std::optional<ImageData1D> AbstractImporter::image1D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1D(): no file opened", {});
CORRADE_ASSERT(id < doImage1DCount(), "Trade::AbstractImporter::image1D(): index out of range", {}); CORRADE_ASSERT(id < doImage1DCount(), "Trade::AbstractImporter::image1D(): index out of range", {});
return doImage1D(id); return doImage1D(id);
} }
ImageData1D* AbstractImporter::doImage1D(UnsignedInt) { return nullptr; } std::optional<ImageData1D> AbstractImporter::doImage1D(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::image2DCount() const { UnsignedInt AbstractImporter::image2DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2DCount(): no file opened", {});
@ -411,13 +422,13 @@ std::string AbstractImporter::image2DName(const UnsignedInt id) {
std::string AbstractImporter::doImage2DName(UnsignedInt) { return {}; } std::string AbstractImporter::doImage2DName(UnsignedInt) { return {}; }
ImageData2D* AbstractImporter::image2D(const UnsignedInt id) { std::optional<ImageData2D> AbstractImporter::image2D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2D(): no file opened", {});
CORRADE_ASSERT(id < doImage2DCount(), "Trade::AbstractImporter::image2D(): index out of range", {}); CORRADE_ASSERT(id < doImage2DCount(), "Trade::AbstractImporter::image2D(): index out of range", {});
return doImage2D(id); return doImage2D(id);
} }
ImageData2D* AbstractImporter::doImage2D(UnsignedInt) { return nullptr; } std::optional<ImageData2D> AbstractImporter::doImage2D(UnsignedInt) { return std::nullopt; }
UnsignedInt AbstractImporter::image3DCount() const { UnsignedInt AbstractImporter::image3DCount() const {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3DCount(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3DCount(): no file opened", {});
@ -441,12 +452,12 @@ std::string AbstractImporter::image3DName(const UnsignedInt id) {
std::string AbstractImporter::doImage3DName(UnsignedInt) { return {}; } std::string AbstractImporter::doImage3DName(UnsignedInt) { return {}; }
ImageData3D* AbstractImporter::image3D(const UnsignedInt id) { std::optional<ImageData3D> AbstractImporter::image3D(const UnsignedInt id) {
CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3D(): no file opened", {}); CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3D(): no file opened", {});
CORRADE_ASSERT(id < doImage3DCount(), "Trade::AbstractImporter::image3D(): index out of range", {}); CORRADE_ASSERT(id < doImage3DCount(), "Trade::AbstractImporter::image3D(): index out of range", {});
return doImage3D(id); return doImage3D(id);
} }
ImageData3D* AbstractImporter::doImage3D(UnsignedInt) { return nullptr; } std::optional<ImageData3D> AbstractImporter::doImage3D(UnsignedInt) { return std::nullopt; }
}} }}

87
src/Trade/AbstractImporter.h

@ -28,9 +28,12 @@
* @brief Class Magnum::Trade::AbstractImporter * @brief Class Magnum::Trade::AbstractImporter
*/ */
#include <memory>
#include <Containers/EnumSet.h> #include <Containers/EnumSet.h>
#include <PluginManager/AbstractPlugin.h> #include <PluginManager/AbstractPlugin.h>
#include "Optional/optional.hpp"
#include "Magnum.h" #include "Magnum.h"
#include "magnumVisibility.h" #include "magnumVisibility.h"
#include "Trade/Trade.h" #include "Trade/Trade.h"
@ -157,10 +160,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief %Scene * @brief %Scene
* @param id %Scene ID, from range [0, sceneCount()). * @param id %Scene ID, from range [0, sceneCount()).
* *
* Returns given scene or `nullptr` if import failed. Deleting the data * Returns given scene or `std::nullopt` if import failed.
* is user responsibility.
*/ */
SceneData* scene(UnsignedInt id); std::optional<SceneData> scene(UnsignedInt id);
/** @brief %Light count */ /** @brief %Light count */
UnsignedInt lightCount() const; UnsignedInt lightCount() const;
@ -185,10 +187,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief %Light * @brief %Light
* @param id %Light ID, from range [0, lightCount()). * @param id %Light ID, from range [0, lightCount()).
* *
* Returns given light or `nullptr` if importing failed. Deleting the * Returns given light or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
LightData* light(UnsignedInt id); std::optional<LightData> light(UnsignedInt id);
/** @brief Camera count */ /** @brief Camera count */
UnsignedInt cameraCount() const; UnsignedInt cameraCount() const;
@ -213,10 +214,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Camera * @brief Camera
* @param id Camera ID, from range [0, cameraCount()). * @param id Camera ID, from range [0, cameraCount()).
* *
* Returns given camera or `nullptr` if importing failed. Deleting the * Returns given camera or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
CameraData* camera(UnsignedInt id); std::optional<CameraData> camera(UnsignedInt id);
/** @brief Two-dimensional object count */ /** @brief Two-dimensional object count */
UnsignedInt object2DCount() const; UnsignedInt object2DCount() const;
@ -241,10 +241,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Two-dimensional object * @brief Two-dimensional object
* @param id Object ID, from range [0, object2DCount()). * @param id Object ID, from range [0, object2DCount()).
* *
* Returns given object or `nullptr` if importing failed. Deleting the * Returns given object or `nullptr` if importing failed.
* data is user responsibility.
*/ */
ObjectData2D* object2D(UnsignedInt id); std::unique_ptr<ObjectData2D> object2D(UnsignedInt id);
/** @brief Three-dimensional object count */ /** @brief Three-dimensional object count */
UnsignedInt object3DCount() const; UnsignedInt object3DCount() const;
@ -269,10 +268,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Three-dimensional object * @brief Three-dimensional object
* @param id Object ID, from range [0, object3DCount()). * @param id Object ID, from range [0, object3DCount()).
* *
* Returns given object or `nullptr` if importing failed. Deleting the * Returns given object or `nullptr` if importing failed.
* data is user responsibility.
*/ */
ObjectData3D* object3D(UnsignedInt id); std::unique_ptr<ObjectData3D> object3D(UnsignedInt id);
/** @brief Two-dimensional mesh count */ /** @brief Two-dimensional mesh count */
UnsignedInt mesh2DCount() const; UnsignedInt mesh2DCount() const;
@ -297,10 +295,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Two-dimensional mesh * @brief Two-dimensional mesh
* @param id %Mesh ID, from range [0, mesh2DCount()). * @param id %Mesh ID, from range [0, mesh2DCount()).
* *
* Returns given mesh or `nullptr` if importing failed. Deleting the * Returns given mesh or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
MeshData2D* mesh2D(UnsignedInt id); std::optional<MeshData2D> mesh2D(UnsignedInt id);
/** @brief Three-dimensional mesh count */ /** @brief Three-dimensional mesh count */
UnsignedInt mesh3DCount() const; UnsignedInt mesh3DCount() const;
@ -325,10 +322,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Three-dimensional mesh * @brief Three-dimensional mesh
* @param id %Mesh ID, from range [0, mesh3DCount()). * @param id %Mesh ID, from range [0, mesh3DCount()).
* *
* Returns given mesh or `nullptr` if importing failed. Deleting the * Returns given mesh or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
MeshData3D* mesh3D(UnsignedInt id); std::optional<MeshData3D> mesh3D(UnsignedInt id);
/** @brief Material count */ /** @brief Material count */
UnsignedInt materialCount() const; UnsignedInt materialCount() const;
@ -353,10 +349,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Material * @brief Material
* @param id Material ID, from range [0, materialCount()). * @param id Material ID, from range [0, materialCount()).
* *
* Returns given material or `nullptr` if importing failed. Deleting * Returns given material or `nullptr` if importing failed.
* the data is user responsibility.
*/ */
AbstractMaterialData* material(UnsignedInt id); std::unique_ptr<AbstractMaterialData> material(UnsignedInt id);
/** @brief %Texture count */ /** @brief %Texture count */
UnsignedInt textureCount() const; UnsignedInt textureCount() const;
@ -381,10 +376,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief %Texture * @brief %Texture
* @param id %Texture ID, from range [0, textureCount()). * @param id %Texture ID, from range [0, textureCount()).
* *
* Returns given texture or `nullptr` if importing failed. Deleting the * Returns given texture or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
TextureData* texture(UnsignedInt id); std::optional<TextureData> texture(UnsignedInt id);
/** @brief One-dimensional image count */ /** @brief One-dimensional image count */
UnsignedInt image1DCount() const; UnsignedInt image1DCount() const;
@ -409,10 +403,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief One-dimensional image * @brief One-dimensional image
* @param id %Image ID, from range [0, image1DCount()). * @param id %Image ID, from range [0, image1DCount()).
* *
* Returns given image or `nullptr` if importing failed. Deleting the * Returns given image or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
ImageData1D* image1D(UnsignedInt id); std::optional<ImageData1D> image1D(UnsignedInt id);
/** @brief Two-dimensional image count */ /** @brief Two-dimensional image count */
UnsignedInt image2DCount() const; UnsignedInt image2DCount() const;
@ -437,10 +430,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Two-dimensional image * @brief Two-dimensional image
* @param id %Image ID, from range [0, image2DCount()). * @param id %Image ID, from range [0, image2DCount()).
* *
* Returns given image or `nullptr` if importing failed. Deleting the * Returns given image or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
ImageData2D* image2D(UnsignedInt id); std::optional<ImageData2D> image2D(UnsignedInt id);
/** @brief Three-dimensional image count */ /** @brief Three-dimensional image count */
UnsignedInt image3DCount() const; UnsignedInt image3DCount() const;
@ -465,10 +457,9 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
* @brief Three-dimensional image * @brief Three-dimensional image
* @param id %Image ID, from range [0, image3DCount()). * @param id %Image ID, from range [0, image3DCount()).
* *
* Returns given image or `nullptr` if importing failed. Deleting the * Returns given image or `std::nullopt` if importing failed.
* data is user responsibility.
*/ */
ImageData3D* image3D(UnsignedInt id); std::optional<ImageData3D> image3D(UnsignedInt id);
/*@}*/ /*@}*/
@ -510,7 +501,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doSceneName(UnsignedInt id); virtual std::string doSceneName(UnsignedInt id);
/** @brief Implementation for scene() */ /** @brief Implementation for scene() */
virtual SceneData* doScene(UnsignedInt id); virtual std::optional<SceneData> doScene(UnsignedInt id);
/** @brief Implementation for lightCount() */ /** @brief Implementation for lightCount() */
virtual UnsignedInt doLightCount() const; virtual UnsignedInt doLightCount() const;
@ -522,7 +513,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doLightName(UnsignedInt id); virtual std::string doLightName(UnsignedInt id);
/** @brief Implementation for light() */ /** @brief Implementation for light() */
virtual LightData* doLight(UnsignedInt id); virtual std::optional<LightData> doLight(UnsignedInt id);
/** @brief Implementation for cameraCount() */ /** @brief Implementation for cameraCount() */
virtual UnsignedInt doCameraCount() const; virtual UnsignedInt doCameraCount() const;
@ -534,7 +525,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doCameraName(UnsignedInt id); virtual std::string doCameraName(UnsignedInt id);
/** @brief Implementation for camera() */ /** @brief Implementation for camera() */
virtual CameraData* doCamera(UnsignedInt id); virtual std::optional<CameraData> doCamera(UnsignedInt id);
/** @brief Implementation for object2DCount() */ /** @brief Implementation for object2DCount() */
virtual UnsignedInt doObject2DCount() const; virtual UnsignedInt doObject2DCount() const;
@ -546,7 +537,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doObject2DName(UnsignedInt id); virtual std::string doObject2DName(UnsignedInt id);
/** @brief Implementation for object2D() */ /** @brief Implementation for object2D() */
virtual ObjectData2D* doObject2D(UnsignedInt id); virtual std::unique_ptr<ObjectData2D> doObject2D(UnsignedInt id);
/** @brief Implementation for object3DCount() */ /** @brief Implementation for object3DCount() */
virtual UnsignedInt doObject3DCount() const; virtual UnsignedInt doObject3DCount() const;
@ -558,7 +549,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doObject3DName(UnsignedInt id); virtual std::string doObject3DName(UnsignedInt id);
/** @brief Implementation for object3D() */ /** @brief Implementation for object3D() */
virtual ObjectData3D* doObject3D(UnsignedInt id); virtual std::unique_ptr<ObjectData3D> doObject3D(UnsignedInt id);
/** @brief Implementation for mesh2DCount() */ /** @brief Implementation for mesh2DCount() */
virtual UnsignedInt doMesh2DCount() const; virtual UnsignedInt doMesh2DCount() const;
@ -570,7 +561,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doMesh2DName(UnsignedInt id); virtual std::string doMesh2DName(UnsignedInt id);
/** @brief Implementation for mesh2D() */ /** @brief Implementation for mesh2D() */
virtual MeshData2D* doMesh2D(UnsignedInt id); virtual std::optional<MeshData2D> doMesh2D(UnsignedInt id);
/** @brief Implementation for mesh3DCount() */ /** @brief Implementation for mesh3DCount() */
virtual UnsignedInt doMesh3DCount() const; virtual UnsignedInt doMesh3DCount() const;
@ -582,7 +573,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doMesh3DName(UnsignedInt id); virtual std::string doMesh3DName(UnsignedInt id);
/** @brief Implementation for mesh3D() */ /** @brief Implementation for mesh3D() */
virtual MeshData3D* doMesh3D(UnsignedInt id); virtual std::optional<MeshData3D> doMesh3D(UnsignedInt id);
/** @brief Implementation for materialCount() */ /** @brief Implementation for materialCount() */
virtual UnsignedInt doMaterialCount() const; virtual UnsignedInt doMaterialCount() const;
@ -594,7 +585,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doMaterialName(UnsignedInt id); virtual std::string doMaterialName(UnsignedInt id);
/** @brief Implementation for material() */ /** @brief Implementation for material() */
virtual AbstractMaterialData* doMaterial(UnsignedInt id); virtual std::unique_ptr<AbstractMaterialData> doMaterial(UnsignedInt id);
/** @brief Implementation for textureCount() */ /** @brief Implementation for textureCount() */
virtual UnsignedInt doTextureCount() const; virtual UnsignedInt doTextureCount() const;
@ -606,7 +597,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doTextureName(UnsignedInt id); virtual std::string doTextureName(UnsignedInt id);
/** @brief Implementation for texture() */ /** @brief Implementation for texture() */
virtual TextureData* doTexture(UnsignedInt id); virtual std::optional<TextureData> doTexture(UnsignedInt id);
/** @brief Implementation for image1DCount() */ /** @brief Implementation for image1DCount() */
virtual UnsignedInt doImage1DCount() const; virtual UnsignedInt doImage1DCount() const;
@ -618,7 +609,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doImage1DName(UnsignedInt id); virtual std::string doImage1DName(UnsignedInt id);
/** @brief Implementation for image1D() */ /** @brief Implementation for image1D() */
virtual ImageData1D* doImage1D(UnsignedInt id); virtual std::optional<ImageData1D> doImage1D(UnsignedInt id);
/** @brief Implementation for image2DCount() */ /** @brief Implementation for image2DCount() */
virtual UnsignedInt doImage2DCount() const; virtual UnsignedInt doImage2DCount() const;
@ -630,7 +621,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doImage2DName(UnsignedInt id); virtual std::string doImage2DName(UnsignedInt id);
/** @brief Implementation for image2D() */ /** @brief Implementation for image2D() */
virtual ImageData2D* doImage2D(UnsignedInt id); virtual std::optional<ImageData2D> doImage2D(UnsignedInt id);
/** @brief Implementation for image3DCount() */ /** @brief Implementation for image3DCount() */
virtual UnsignedInt doImage3DCount() const; virtual UnsignedInt doImage3DCount() const;
@ -642,7 +633,7 @@ class MAGNUM_EXPORT AbstractImporter: public PluginManager::AbstractPlugin {
virtual std::string doImage3DName(UnsignedInt id); virtual std::string doImage3DName(UnsignedInt id);
/** @brief Implementation for image3D() */ /** @brief Implementation for image3D() */
virtual ImageData3D* doImage3D(UnsignedInt id); virtual std::optional<ImageData3D> doImage3D(UnsignedInt id);
}; };
CORRADE_ENUMSET_OPERATORS(AbstractImporter::Features) CORRADE_ENUMSET_OPERATORS(AbstractImporter::Features)

7
src/Trade/CameraData.h

@ -35,12 +35,7 @@ namespace Magnum { namespace Trade {
/** /**
@brief %Camera data @brief %Camera data
*/ */
class MAGNUM_EXPORT CameraData { class MAGNUM_EXPORT CameraData {};
CameraData(const CameraData&) = delete;
CameraData(CameraData&&) = delete;
CameraData& operator=(const CameraData&) = delete;
CameraData& operator=(CameraData&&) = delete;
};
}} }}

7
src/Trade/LightData.h

@ -35,12 +35,7 @@ namespace Magnum { namespace Trade {
/** /**
@brief %Light data @brief %Light data
*/ */
class MAGNUM_EXPORT LightData { class MAGNUM_EXPORT LightData {};
LightData(const LightData&) = delete;
LightData(LightData&&) = delete;
LightData& operator=(const LightData&) = delete;
LightData& operator=(LightData&&) = delete;
};
}} }}

Loading…
Cancel
Save