//===-- AddressResolverName.h -----------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_AddressResolverName_h_
#define liblldb_AddressResolverName_h_

// Project includes

#include "lldb/Core/AddressResolver.h"

namespace lldb_private {

//----------------------------------------------------------------------
/// @class AddressResolverName AddressResolverName.h "lldb/Core/AddressResolverName.h"
/// @brief This class finds addresses for a given function name, either by exact match
/// or by regular expression.
//----------------------------------------------------------------------

class AddressResolverName:
    public AddressResolver
{
public:

    AddressResolverName (const char *func_name,
                         AddressResolver::MatchType type = Exact);

    // Creates a function breakpoint by regular expression.  Takes over control of the lifespan of func_regex.
    AddressResolverName (RegularExpression &func_regex);

    AddressResolverName (const char *class_name,
                         const char *method,
                         AddressResolver::MatchType type);

    virtual
    ~AddressResolverName ();

    virtual Searcher::CallbackReturn
    SearchCallback (SearchFilter &filter,
                    SymbolContext &context,
                    Address *addr,
                    bool containing);

    virtual Searcher::Depth
    GetDepth ();

    virtual void
    GetDescription (Stream *s);

protected:
    ConstString m_func_name;
    ConstString m_class_name;  // FIXME: Not used yet.  The idea would be to stop on methods of this class.
    RegularExpression m_regex;
    AddressResolver::MatchType m_match_type;

private:
    DISALLOW_COPY_AND_ASSIGN(AddressResolverName);
};

} // namespace lldb_private

#endif  // liblldb_AddressResolverName_h_
