/*
* File:        SearchPath.h
*
* Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
* See included license file for license details.
*/
#if !defined(_searchpath_h_)
#define _searchpath_h_

#include <string>
#include <list>

/*!
* \brief Handles searching a list of paths for a file.
*/
class PathSearcher
{
public:
       //!
       enum _target_type
       {
               kFindFile,
               kFindDirectory
       };

       //!
       typedef enum _target_type target_type_t;

protected:
       //! Global search object singleton.
       static PathSearcher * s_searcher;

public:
       //! \brief Access global path searching object.
       static PathSearcher & getGlobalSearcher();

public:
       //! \brief Constructor.
       PathSearcher() {}

       //! \brief Add a new search path to the end of the list.
       void addSearchPath(std::string & path);

       //! \brief Attempts to locate a file by using the search paths.
       bool search(const std::string & base, target_type_t targetType, bool searchCwd, std::string & result);

protected:
       typedef std::list<std::string> string_list_t;   //!< Linked list of strings.
       string_list_t m_paths;  //!< Ordered list of paths to search.

       //! \brief Returns whether \a path is absolute.
       bool isAbsolute(const std::string & path);

       //! \brief Combines two paths into a single one.
       std::string joinPaths(const std::string & first, const std::string & second);
};

#endif // _searchpath_h_