diff options
author | Travis CI <zmoelnig@travis-ci.umlaeute.mur.at> | 2015-03-17 22:38:45 +0000 |
---|---|---|
committer | Travis CI <zmoelnig@travis-ci.umlaeute.mur.at> | 2015-03-17 22:38:45 +0000 |
commit | 356f94fc355f36c16e48555d10c2377dff4b7554 (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 /Gem/develop/include/Gem/Utils/any.h | |
parent | 5c694f159b012d1d94bf15bfe580dec52e4fe797 (diff) |
Gem 096ed6ef786b7a9d6e11a437ff8526619c89a1fd osx/x86_64
built 'coverity_scan:096ed6ef786b7a9d6e11a437ff8526619c89a1fd' for osx/x86_64
Diffstat (limited to 'Gem/develop/include/Gem/Utils/any.h')
-rw-r--r-- | Gem/develop/include/Gem/Utils/any.h | 318 |
1 files changed, 0 insertions, 318 deletions
diff --git a/Gem/develop/include/Gem/Utils/any.h b/Gem/develop/include/Gem/Utils/any.h deleted file mode 100644 index fc66b46..0000000 --- a/Gem/develop/include/Gem/Utils/any.h +++ /dev/null @@ -1,318 +0,0 @@ -/* - * (C) Copyright Christopher Diggins 2005 - * (C) Copyright Pablo Aguilar 2005 - * (C) Copyright Kevlin Henney 2001 - * - * Copyright (C) 2010-2011 IOhannes m zmölnig. forum::für::umläute. IEM. zmoelnig@iem.at - * downloaded this code from http://www.codeproject.com/KB/cpp/dynamic_typing.aspx - * changed namespace/defines "cdiggins" to something "gem" - * - * Distributed under 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) - */ - -#ifndef GEM_ANY_HPP -#define GEM_ANY_HPP - -#include "Gem/ExportDef.h" - -#ifdef _MSC_VER -# pragma warning( push ) -# pragma warning( disable: 4275 ) -#endif - -#include <stdexcept> -#include <typeinfo> -#include <algorithm> -#include <string> - - -namespace gem -{ - struct GEM_EXTERN bad_any_cast : std::bad_cast { - bad_any_cast(const std::type_info& src, const std::type_info& dest) - : result(std::string("bad cast (")+src.name() + "->" + dest.name()+")") - { } - virtual ~bad_any_cast(void) throw() - { } - virtual const char* what(void) const throw() { - return result.c_str(); - } - const std::string result; - }; - - namespace any_detail { - // function pointer table - - struct fxn_ptr_table { - const std::type_info& (*get_type)(void); - void (*static_delete)(void**); - void (*clone)(void* const*, void**); - void (*move)(void* const*,void**); - }; - - // static functions for small value-types - - template<bool is_small> - struct fxns - { - template<typename T> - struct type { - static const std::type_info& get_type(void) { - const std::type_info&res=typeid(T); - // the following is a dummy use of the type_info struct - // to make the template engine work properly on OSX/10.9 - static std::string _ = res.name(); - return res; - } - static void static_delete(void** x) { - reinterpret_cast<T*>(x)->~T(); - } - static void clone(void* const* src, void** dest) { - new(dest) T(*reinterpret_cast<T const*>(src)); - } - static void move(void* const* src, void** dest) { - reinterpret_cast<T*>(dest)->~T(); - *reinterpret_cast<T*>(dest) = *reinterpret_cast<T const*>(src); - } - }; - }; - - // static functions for big value-types (bigger than a void*) - - template<> - struct fxns<false> - { - template<typename T> - struct type { - static const std::type_info& get_type(void) { - const std::type_info&res=typeid(T); - return res; - } - static void static_delete(void** x) { - delete(*reinterpret_cast<T**>(x)); - } - static void clone(void* const* src, void** dest) { - *dest = new T(**reinterpret_cast<T* const*>(src)); - } - static void move(void* const* src, void** dest) { - (*reinterpret_cast<T**>(dest))->~T(); - **reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src); - } - }; - }; - - template<typename T> - struct get_table - { - static const bool is_small = sizeof(T) <= sizeof(void*); - - static fxn_ptr_table* get(void) - { - static fxn_ptr_table static_table = { - fxns<is_small>::template type<T>::get_type - , fxns<is_small>::template type<T>::static_delete - , fxns<is_small>::template type<T>::clone - , fxns<is_small>::template type<T>::move - }; - return &static_table; - } - }; - - struct empty { - }; - } // namespace any_detail - - - struct GEM_EXTERN any - { - // structors - - template <typename T> - any(const T& x) : table(NULL), object(NULL) { - table = any_detail::get_table<T>::get(); - if (sizeof(T) <= sizeof(void*)) { - new(&object) T(x); - } - else { - object = new T(x); - } - } - - any(void) : table(NULL), object(NULL) { - table = any_detail::get_table<any_detail::empty>::get(); - object = NULL; - } - - any(const any& x) : table(NULL), object(NULL) { - table = any_detail::get_table<any_detail::empty>::get(); - assign(x); - } - - virtual ~any(void) { - table->static_delete(&object); - } - - // assignment - - any& assign(const any& x) { - // are we copying between the same type? - - if (table == x.table) { - // if so, we can avoid reallocation - - table->move(&x.object, &object); - } - else { - reset(); - x.table->clone(&x.object, &object); - table = x.table; - } - return *this; - } - - template <typename T> - any& assign(const T& x) - { - // are we copying between the same type? - - any_detail::fxn_ptr_table* x_table = any_detail::get_table<T>::get(); - if (table == x_table) { - // if so, we can avoid deallocating and resuse memory - - if (sizeof(T) <= sizeof(void*)) { - // create copy on-top of object pointer itself - - new(&object) T(x); - } - else { - // create copy on-top of old version - - new(object) T(x); - } - } - else { - reset(); - if (sizeof(T) <= sizeof(void*)) { - // create copy on-top of object pointer itself - - new(&object) T(x); - // update table pointer - - table = x_table; - } - else { - object = new T(x); - table = x_table; - } - } - return *this; - } - - // assignment operator - - template<typename T> - any& operator=(T const& x) { - return assign(x); - } - any& operator=(const any& x) { - return assign(x); - } - - // utility functions - - any& swap(any& x) { - std::swap(table, x.table); - std::swap(object, x.object); - return *this; - } - - const std::type_info& get_type(void) const { - return table->get_type(); - } - - template<typename T> - const T& cast(void) const { - if (!compatible<T>()) { - throw bad_any_cast(get_type(), typeid(T)); - } - if (sizeof(T) <= sizeof(void*)) { - return *reinterpret_cast<T const*>(&object); - } - else { - return *reinterpret_cast<T const*>(object); - } - } - - /// Returns true if the two types are the same. - bool compatible(const any& x) const { - return get_type() == x.get_type(); - } - /// Returns true if the two types are the same. - template<typename T> - bool compatible() const { - return (get_type() == typeid(T)); - } - - // implicit casting is disabled by default - - #ifdef ANY_IMPLICIT_CASTING - // automatic casting operator - - template<typename T> - operator T(void) const { - return cast<T>(); - } - #endif // implicit casting - - - bool empty(void) const { - return table == any_detail::get_table<any_detail::empty>::get(); - } - - void reset(void) - { - if (empty()) return; - table->static_delete(&object); - table = any_detail::get_table<any_detail::empty>::get(); - object = NULL; - } - - // fields - - any_detail::fxn_ptr_table* table; - void* object; - }; - - // boost::any-like casting - - template<typename T> - T* any_cast(any* this_) { - if (this_->get_type() != typeid(T)) { - throw bad_any_cast(this_->get_type(), typeid(T)); - } - if (sizeof(T) <= sizeof(void*)) { - return reinterpret_cast<T*>(&this_->object); - } - else { - return reinterpret_cast<T*>(this_->object); - } - } - - template<typename T> - T const* any_cast(any const* this_) { - return any_cast<T>(const_cast<any*>(this_)); - } - - template<typename T> - T const& any_cast(any const& this_){ - return *any_cast<T>(const_cast<any*>(&this_)); - } -} - -#ifdef _MSC_VER -# pragma warning( pop ) -#endif - -#endif // GEM_ANY_HPP |