/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_CLONE_HXX #define INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_CLONE_HXX namespace detail { template struct has_clone { template struct test; typedef char yes; typedef struct { char a[2]; } no; template static yes& check_sig(U*, test* = 0); template static no& check_sig(...); enum { value = sizeof(check_sig(0)) == sizeof(yes) }; }; template struct cloner { static T* clone(T* const other) { return new T(*other); } }; template struct cloner { static T* clone(T* const other) { return other->clone(); } }; } /** Creates a new copy of the passed object. If other is 0, just returns 0. Otherwise, if other has function named clone with signature T* (T::*)() const, the function is called. Otherwise, copy constructor is used. @returns 0 or newly allocated object */ template T* clone(T* const other) { return other ? ::detail::cloner::value>::clone(other) : 0; } #endif // INCLUDED_LOTUSWORDPRO_SOURCE_FILTER_CLONE_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */