//===------------------------ __refstring ---------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP___REFSTRING
#define _LIBCPP___REFSTRING

#include <__config>
#include <cstddef>
#include <cstring>
#if __APPLE__
#include <dlfcn.h>
#include <mach-o/dyld.h>
#endif

_LIBCPP_BEGIN_NAMESPACE_STD

class _LIBCPP_HIDDEN __libcpp_refstring
{
private:
    const char* str_;

    typedef int count_t;

    struct _Rep_base
    {
        std::size_t len;
        std::size_t cap;
        count_t     count;
    };

    static
    _Rep_base*
    rep_from_data(const char *data_) _NOEXCEPT
    {
        char *data = const_cast<char *>(data_);
        return reinterpret_cast<_Rep_base *>(data - sizeof(_Rep_base));
    }
    static
    char *
    data_from_rep(_Rep_base *rep) _NOEXCEPT
    {
        char *data = reinterpret_cast<char *>(rep);
        return data + sizeof(*rep);
    }

#if __APPLE__
    static
    const char*
    compute_gcc_empty_string_storage() _NOEXCEPT
    {
        void* handle = dlopen("/usr/lib/libstdc++.6.dylib", RTLD_NOLOAD);
        if (handle == nullptr)
            return nullptr;
        void* sym = dlsym(handle, "_ZNSs4_Rep20_S_empty_rep_storageE");
        if (sym == nullptr)
            return nullptr;
        return data_from_rep(reinterpret_cast<_Rep_base *>(sym));
    }

    static
    const char*
    get_gcc_empty_string_storage() _NOEXCEPT
    {
        static const char* p = compute_gcc_empty_string_storage();
        return p;
    }

    bool
    uses_refcount() const
    {
        return str_ != get_gcc_empty_string_storage();
    }
#else
    bool
    uses_refcount() const
    {
        return true;
    }
#endif

public:
    explicit __libcpp_refstring(const char* msg) {
        std::size_t len = strlen(msg);
        _Rep_base* rep = static_cast<_Rep_base *>(::operator new(sizeof(*rep) + len + 1));
        rep->len = len;
        rep->cap = len;
        rep->count = 0;
        char *data = data_from_rep(rep);
        std::memcpy(data, msg, len + 1);
        str_ = data;
    }

    __libcpp_refstring(const __libcpp_refstring& s) _NOEXCEPT : str_(s.str_)
    {
        if (uses_refcount())
            __sync_add_and_fetch(&rep_from_data(str_)->count, 1);
    }

    __libcpp_refstring& operator=(const __libcpp_refstring& s) _NOEXCEPT
    {
        bool adjust_old_count = uses_refcount();
        struct _Rep_base *old_rep = rep_from_data(str_);
        str_ = s.str_;
        if (uses_refcount())
            __sync_add_and_fetch(&rep_from_data(str_)->count, 1);
        if (adjust_old_count)
        {
            if (__sync_add_and_fetch(&old_rep->count, count_t(-1)) < 0)
            {
                ::operator delete(old_rep);
            }
        }
        return *this;
    }

    ~__libcpp_refstring()
    {
        if (uses_refcount())
        {
            _Rep_base* rep = rep_from_data(str_);
            if (__sync_add_and_fetch(&rep->count, count_t(-1)) < 0)
            {
                ::operator delete(rep);
            }
        }
    }

    const char* c_str() const _NOEXCEPT {return str_;}
};

_LIBCPP_END_NAMESPACE_STD

#endif //_LIBCPP___REFSTRING
