#ifndef _INCLUDED_BOBCAT_WRAP1_
#define _INCLUDED_BOBCAT_WRAP1_

namespace FBB
{
    template <typename Type, typename ReturnType = void>
    class Wrap1
    {
        union
        {
            ReturnType (*d_ref)(Type &);
            ReturnType (*d_cref)(Type const &);
            ReturnType (*d_ptr)(Type *);
            ReturnType (*d_cptr)(Type const *);
        };

        public:
            typedef Type        argument_type;
            typedef ReturnType  result_type;


            Wrap1(ReturnType (*fun)(Type &))
            :
                d_ref(fun)
            {}

            Wrap1(ReturnType (*fun)(Type *))
            :
                d_ptr(fun)
            {}

            Wrap1(ReturnType (*fun)(Type const &))  
            :
                d_cref(fun)
            {}

            Wrap1(ReturnType (*fun)(Type const *))  
            :
                d_cptr(fun)
            {}

            ReturnType operator()(Type &param) const
            {
                return (*d_ref)(param);
            }

            ReturnType operator()(Type *param) const
            {
                return (*d_ptr)(param);
            }

            ReturnType operator()(Type const &param) const
            {
                return (*d_cref)(param);
            }

            ReturnType operator()(Type const *param) const
            {
                return (*d_cptr)(param);
            }
    };
} // namespace FBB ends
#endif

