libpsynth 0.2.1
Namespaces | Defines
/home/raskolnikov/dev/psynth/trunk/src/psynth/base/declare.hpp File Reference

Time-stamp: <2011-06-17 10:42:41 raskolnikov> More...

#include <utility>
#include <memory>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <psynth/base/preprocessor.hpp>
Include dependency graph for declare.hpp:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Namespaces

namespace  psynth
namespace  psynth::base

Defines

#define PSYNTH_DECLARE_SHARED_POINTER(type_name)
#define PSYNTH_DECLARE_TYPE(type_name)   struct type_name;
#define PSYNTH_DECLARE_SHARED_TYPE(type_name)
#define PSYNTH_DECLARE_SHARED_POINTER_TEMPLATE(type_name,...)
#define PSYNTH_TEMPLATE_PARAM_ITER(r, data, i, elem)   BOOST_PP_COMMA_IF(i) elem BOOST_PP_CAT(Par__, i)
#define PSYNTH_TEMPLATE_PARAMS_FULL(param_seq)   BOOST_PP_SEQ_FOR_EACH_I(PSYNTH_TEMPLATE_PARAM_ITER, _, param_seq)
#define PSYNTH_TEMPLATE_PARAMS(param_seq)   BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(param_seq), Par__)
#define PSYNTH_DECLARE_SHARED_POINTER_TEMPLATE_IMPL(type_name, param_seq)
#define PSYNTH_DECLARE_TEMPLATE(type_name,...)
#define PSYNTH_DECLARE_SHARED_TEMPLATE(type_name,...)

Detailed Description

Time-stamp: <2011-06-17 10:42:41 raskolnikov>

Author:
Juan Pedro Bolivar Puente <raskolnikov@es.gnu.org>
Date:
Mon Oct 18 15:11:23 2010

Aiding in forward declaring types.

Todo:
The new template declarations is cool but we have to check the performance.

Define Documentation

#define PSYNTH_DECLARE_SHARED_POINTER (   type_name)
Value:
typedef std::shared_ptr<type_name> type_name ## _ptr;               \
    typedef std::weak_ptr<type_name> type_name ## _weak_ptr;            \
    template <typename... Args>                                         \
    type_name ## _ptr new_ ## type_name (Args && ... args)              \
    {                                                                   \
        return std::make_shared <type_name> (                           \
            std::forward<Args>(args) ...);                              \
    }
#define PSYNTH_DECLARE_SHARED_POINTER_TEMPLATE (   type_name,
  ... 
)
Value:
Todo:
Use template typedefs when available.
#define PSYNTH_DECLARE_SHARED_POINTER_TEMPLATE_IMPL (   type_name,
  param_seq 
)
Value:
template <PSYNTH_TEMPLATE_PARAMS_FULL(param_seq)>                   \
    struct type_name ## _ptr :                                          \
        public std::shared_ptr<type_name <PSYNTH_TEMPLATE_PARAMS(param_seq)> > \
    {                                                                   \
        typedef std::shared_ptr<type_name <PSYNTH_TEMPLATE_PARAMS(param_seq)> > base; \
        template <typename... Args>                                     \
            type_name ## _ptr (Args&&... args)                          \
            : base (std::forward<Args> (args) ...) {}                   \
        template <typename... Args>                                     \
            type_name ## _ptr& operator= (Args&&... args)               \
            { this->base::operator= (std::forward<Args> (args) ...); return *this; } \
    };                                                                  \
                                                                        \
    template <PSYNTH_TEMPLATE_PARAMS_FULL(param_seq), typename... Args> \
    type_name ## _ptr<PSYNTH_TEMPLATE_PARAMS(param_seq)>                \
    inline new_ ## type_name (Args && ... args)                                \
    {                                                                   \
        return                                                          \
            std::make_shared <type_name <PSYNTH_TEMPLATE_PARAMS(param_seq)> > \
            (std::forward<Args>(args)...);                              \
    }
#define PSYNTH_DECLARE_SHARED_TEMPLATE (   type_name,
  ... 
)
Value:
PSYNTH_DECLARE_TEMPLATE (type_name, __VA_ARGS__)                    \
    PSYNTH_DECLARE_SHARED_POINTER_TEMPLATE (type_name, __VA_ARGS__)
#define PSYNTH_DECLARE_SHARED_TYPE (   type_name)
Value:
#define PSYNTH_DECLARE_TEMPLATE (   type_name,
  ... 
)
Value:
template <__VA_ARGS__>                                          \
    struct type_name;
#define PSYNTH_DECLARE_TYPE (   type_name)    struct type_name;
#define PSYNTH_TEMPLATE_PARAM_ITER (   r,
  data,
  i,
  elem 
)    BOOST_PP_COMMA_IF(i) elem BOOST_PP_CAT(Par__, i)
#define PSYNTH_TEMPLATE_PARAMS (   param_seq)    BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(param_seq), Par__)
#define PSYNTH_TEMPLATE_PARAMS_FULL (   param_seq)    BOOST_PP_SEQ_FOR_EACH_I(PSYNTH_TEMPLATE_PARAM_ITER, _, param_seq)