/*
 *
 * Copyright (c) 2004
 * John Maddock
 *
 * Use, modification and distribution are 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)
 *
 */

/*
 *   LOCATION:    see http://www.boost.org for most recent version.
 *   FILE         basic_regex_creator.cpp
 *   VERSION      see <boost/version.hpp>
 *   DESCRIPTION: Declares template class basic_regex_creator which fills in
 *                the data members of a regex_data object.
 */

#ifndef BOOST_REGEX_V4_PROTECTED_CALL_HPP
#define BOOST_REGEX_V4_PROTECTED_CALL_HPP

#include <boost/config.hpp>

#ifdef BOOST_MSVC
#pragma warning(push)
#pragma warning(disable: 4103)
#endif
#ifdef BOOST_HAS_ABI_HEADERS
#  include BOOST_ABI_PREFIX
#endif
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif

namespace boost {
namespace BOOST_REGEX_DETAIL_NS {

class BOOST_REGEX_DECL abstract_protected_call
{
  public:
    bool BOOST_REGEX_CALL
    execute()const;
    // this stops gcc-4 from complaining:
    virtual
    ~abstract_protected_call() {}
  private:
    virtual bool
    call()const = 0;
};

template <class T>
class concrete_protected_call
    : public abstract_protected_call
{
  public:
    typedef bool (T::*proc_type)();
    concrete_protected_call(T* o, proc_type p)
        : obj(o), proc(p) {}
  private:
    bool
    call()const BOOST_OVERRIDE;
    T* obj;
    proc_type proc;
};

template <class T>
bool
concrete_protected_call<T>::call()const
{
    return (obj->*proc)();
}

}
} // namespace boost

#ifdef BOOST_MSVC
#pragma warning(push)
#pragma warning(disable: 4103)
#endif
#ifdef BOOST_HAS_ABI_HEADERS
#  include BOOST_ABI_SUFFIX
#endif
#ifdef BOOST_MSVC
#pragma warning(pop)
#endif

#endif
