/* -----------------------------------------------------------------------------
 * std_string_view.i
 *
 * SWIG typemaps for std::string_view types
 * ----------------------------------------------------------------------------- */

%include <exception.i>

%{
#include <string_view>
%}

namespace std {

    %naturalvar string_view;

    class string_view;

    %typemap(typecheck,precedence=SWIG_TYPECHECK_STRINGVIEW) string_view, const string_view& %{
        $1 = (Z_TYPE($input) == IS_STRING) ? 1 : 0;
    %}

    %typemap(in, phptype="string") string_view %{
        convert_to_string(&$input);
        $1 = std::string_view(Z_STRVAL($input), Z_STRLEN($input));
    %}

    %typemap(in, phptype="string") const string_view& ($*1_ltype temp) %{
        convert_to_string(&$input);
        temp = std::string_view(Z_STRVAL($input), Z_STRLEN($input));
        $1 = &temp;
    %}

    %typemap(directorout) string_view %{
        convert_to_string($input);
        $result = std::string_view(Z_STRVAL_P($input), Z_STRLEN_P($input));
    %}

    %typemap(out, phptype="string") string_view %{
        ZVAL_STRINGL($result, $1.data(), $1.size());
    %}

    %typemap(directorin) string_view, const string_view& %{
        ZVAL_STRINGL($input, $1.data(), $1.size());
    %}

    %typemap(out, phptype="string") const string_view& %{
        ZVAL_STRINGL($result, $1->data(), $1->size());
    %}

    %typemap(throws) string_view, const string_view& %{
        {
            zval swig_exception;
            ZVAL_STRINGL(&swig_exception, $1.data(), $1.size());
            zend_throw_exception_object(&swig_exception);
            goto fail;
        }
    %}

    %typemap(throws) string_view*, const string_view* %{
        {
            zval swig_exception;
            ZVAL_STRINGL(&swig_exception, $1->data(), $1->size());
            zend_throw_exception_object(&swig_exception);
            goto fail;
        }
    %}

}
