/*
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * Copyright 2016 Danny Robson <danny@nerdcruft.net>
 */

#ifndef CRUFT_UTIL_FIXUP_EXPERIMENTAL_FILESYSTEM_HPP
#define CRUFT_UTIL_FIXUP_EXPERIMENTAL_FILESYSTEM_HPP

#include <string>

///////////////////////////////////////////////////////////////////////////////
namespace std::filesystem {
    class path {
    public:
        using value_type = char;
        using string_type = std::basic_string<value_type>;
        
        static constexpr value_type preferred_separator = '/';

        path ();
        explicit path (const path&);

        template <class Source>
        path (const Source &s):
            m_path (s)
        { ; }

        template <class InputT>
        path (InputT first, InputT last):
            m_path (first, last)
        { ; }

        std::string string (void) const;

        const string_type& native (void) const;
        const value_type* c_str (void) const;

        path filename (void) const;
        path stem (void) const;

        path& operator/= (const path&);

    private:
        string_type m_path;
    };

    path operator/ (const path&, const path&);

    bool operator== (const path&, const path&);

    //bool is_directory (file_status);
    bool is_directory (const path&);
    //bool is_directory (const path&, error_code&);

    template <class CharT, class Traits>
    std::basic_ostream<CharT,Traits>&
    operator<< (std::basic_ostream<CharT,Traits> &os, const path &p)
    { return os << p.native (); }
}


#endif