Skip to content
Snippets Groups Projects
  • Nat Goodspeed's avatar
    9ffcafb6
    SL-10153: Introduce ll_convert, windows_message() templates. · 9ffcafb6
    Nat Goodspeed authored
    Add ll_convert<TO, FROM> template, used as (e.g.):
    ll_convert<std::string>(value_of_some_other_string_type);
    There is no generic template implementation -- the template exists solely to
    provide generic aliases for a bewildering family of llstring.h string-
    conversion functions with highly-specific names. There's a generic
    implementation, though, for the degenerate case where FROM and TO are
    identical.
    
    Add ll_convert<> specialization aliases for most of the string-conversion
    functions declared in llstring.h, including the Windows-specific ones
    involving llutf16string and std::wstring.
    
    Add a mini-lecture in llstring.h about appropriate use of string types on
    Windows.
    
    Add LL_WCHAR_T_NATIVE llpreprocessor.h macro so we can detect whether to
    provide separate conversions for llutf16string and std::wstring, or whether
    those would collide because the types are identical.
    
    Add inline ll_convert_wide_to_string(const std::wstring&) overloads so caller
    isn't required to call arg.c_str(), which naturally permits an ll_convert
    alias.
    
    Add ll_convert_wide_to_wstring(), ll_convert_wstring_to_wide() as placeholders
    for converting between Windows std::wstring and Linden LLWString, with
    corresponding ll_convert aliases. We don't yet have library code to perform
    such conversions officially; for now, just copy characters.
    
    Add LLStringUtil::getenv(key) and getoptenv(key) functions. The latter returns
    boost::optional<string_type> in case the caller needs to detect absence of a
    given environment variable rather than simply accepting a default value.
    Naturally getenv(), which accepts a default, is implemented using getoptenv().
    getoptenv(), in turn, is implemented using an underlying llstring_getoptenv().
    
    On Windows, llstring_getoptenv() returns boost::optional<std::wstring> (based
    on GetEnvironmentVariableW()), whereas elsewhere, llstring_getoptenv() returns
    boost::optional<std::string> (based on classic Posix getenv()).
    
    The beauty of generic ll_convert is that the portable LLStringUtilBase<T>::
    getoptenv() template can call the platform-specific llstring_getoptenv() and
    transparently perform whatever conversion is necessary to return the desired
    string_type.
    
    Add windows_message<T>(error) template, with an overload that implicitly calls
    GetLastError(). We provide a single concrete windows_message<std::wstring>()
    implementation because that's what we get from Windows FormatMessageW() --
    everything else is a generic conversion to the desired target string type.
    
    This obviates llprocess.cpp's previous WindowsErrorString() implementation --
    reimplement using windows_message<std::string>().
    9ffcafb6
    History
    SL-10153: Introduce ll_convert, windows_message() templates.
    Nat Goodspeed authored
    Add ll_convert<TO, FROM> template, used as (e.g.):
    ll_convert<std::string>(value_of_some_other_string_type);
    There is no generic template implementation -- the template exists solely to
    provide generic aliases for a bewildering family of llstring.h string-
    conversion functions with highly-specific names. There's a generic
    implementation, though, for the degenerate case where FROM and TO are
    identical.
    
    Add ll_convert<> specialization aliases for most of the string-conversion
    functions declared in llstring.h, including the Windows-specific ones
    involving llutf16string and std::wstring.
    
    Add a mini-lecture in llstring.h about appropriate use of string types on
    Windows.
    
    Add LL_WCHAR_T_NATIVE llpreprocessor.h macro so we can detect whether to
    provide separate conversions for llutf16string and std::wstring, or whether
    those would collide because the types are identical.
    
    Add inline ll_convert_wide_to_string(const std::wstring&) overloads so caller
    isn't required to call arg.c_str(), which naturally permits an ll_convert
    alias.
    
    Add ll_convert_wide_to_wstring(), ll_convert_wstring_to_wide() as placeholders
    for converting between Windows std::wstring and Linden LLWString, with
    corresponding ll_convert aliases. We don't yet have library code to perform
    such conversions officially; for now, just copy characters.
    
    Add LLStringUtil::getenv(key) and getoptenv(key) functions. The latter returns
    boost::optional<string_type> in case the caller needs to detect absence of a
    given environment variable rather than simply accepting a default value.
    Naturally getenv(), which accepts a default, is implemented using getoptenv().
    getoptenv(), in turn, is implemented using an underlying llstring_getoptenv().
    
    On Windows, llstring_getoptenv() returns boost::optional<std::wstring> (based
    on GetEnvironmentVariableW()), whereas elsewhere, llstring_getoptenv() returns
    boost::optional<std::string> (based on classic Posix getenv()).
    
    The beauty of generic ll_convert is that the portable LLStringUtilBase<T>::
    getoptenv() template can call the platform-specific llstring_getoptenv() and
    transparently perform whatever conversion is necessary to return the desired
    string_type.
    
    Add windows_message<T>(error) template, with an overload that implicitly calls
    GetLastError(). We provide a single concrete windows_message<std::wstring>()
    implementation because that's what we get from Windows FormatMessageW() --
    everything else is a generic conversion to the desired target string type.
    
    This obviates llprocess.cpp's previous WindowsErrorString() implementation --
    reimplement using windows_message<std::string>().
Code owners
Assign users and groups as approvers for specific file changes. Learn more.