//===-- AddressResolver.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_AddressResolver_h_
#define liblldb_AddressResolver_h_

#include <vector>

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Core/Address.h"
#include "lldb/Core/AddressRange.h"
#include "lldb/Host/FileSpec.h"
#include "lldb/Core/RegularExpression.h"
#include "lldb/Core/SearchFilter.h"
#include "lldb/Core/ConstString.h"

namespace lldb_private {

//----------------------------------------------------------------------
/// @class AddressResolver AddressResolver.h "lldb/Core/AddressResolver.h"
/// @brief This class works with SearchFilter to resolve function names and
/// source file locations to their concrete addresses.
//----------------------------------------------------------------------

//----------------------------------------------------------------------
/// General Outline:
/// The AddressResolver is a Searcher.  In that protocol,
/// the SearchFilter asks the question "At what depth of the symbol context
/// descent do you want your callback to get called?" of the filter.  The resolver
/// answers this question (in the GetDepth method) and provides the resolution callback.
//----------------------------------------------------------------------

class AddressResolver :
   public Searcher
{
public:

    typedef enum
    {
        Exact,
        Regexp,
        Glob
    } MatchType;


    AddressResolver ();

    virtual
    ~AddressResolver ();

    virtual void
    ResolveAddress (SearchFilter &filter);

    virtual void
    ResolveAddressInModules (SearchFilter &filter,
                             ModuleList &modules);

    virtual void
    GetDescription (Stream *s) = 0;

    std::vector<AddressRange> &
    GetAddressRanges ();

    size_t
    GetNumberOfAddresses ();

    AddressRange &
    GetAddressRangeAtIndex (size_t idx);

protected:

    std::vector<AddressRange> m_address_ranges;

private:
    DISALLOW_COPY_AND_ASSIGN(AddressResolver);
};

} // namespace lldb_private

#endif  // liblldb_AddressResolver_h_
