Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for resize [perhaps also capacity and reserve] for cista::generic_string/basic_string #189

Open
ChemistAion opened this issue Jun 22, 2023 · 2 comments

Comments

@ChemistAion
Copy link

ChemistAion commented Jun 22, 2023

There is a usage pattern for string like types when internal buffer (with known size a priori)] is filled later, e.g.:
https://github.com/ocornut/imgui/blob/master/misc/cpp/imgui_stdlib.cpp

Could you please consider to add resize() or even more - additionally with: capacity() and reserve() to mimic what the gang from std does... just to handle such callback-cases in a elegant way 😇

@ChemistAion
Copy link
Author

ChemistAion commented Jun 22, 2023

For now, for this particular usage I have this thing:

struct InputTextCallback_Meta
{
    madX::Meta::String* string_;
    ImGuiInputTextCallback chain_callback_;
    void* chain_user_data_;
};

static int Meta_InputTextCallback(ImGuiInputTextCallbackData* data)
{
    InputTextCallback_Meta* user_data = (InputTextCallback_Meta*)data->UserData;
    if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
    {
        madX::Meta::String* string = user_data->string_;
        IM_ASSERT(data->Buf == string->data());
        
        string->move_from(madX::Meta::String("", data->BufTextLen < madX::Meta::StringShortLength ? madX::Meta::StringShortLength : data->BufTextLen));
        data->Buf = string->data();
    }
    else if (user_data->chain_callback_)
    {
        data->UserData = user_data->chain_user_data_;
        return user_data->chain_callback_(data);
    }
    return 0;
}

bool ImGui::InputTextWithHint(const char* label, const char* hint, madX::Meta::String* string, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
{
    IM_ASSERT(string);
    IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
    flags |= ImGuiInputTextFlags_CallbackResize;
   
    InputTextCallback_Meta meta
    {
        string,
        callback,
        user_data
    };

    return InputTextWithHint
    (
        label,
        hint,
        string->data(),
        string->size() + 1,
        flags,
        Meta_InputTextCallback,
        &meta
    );
}

Works flawlessly, but it is not elegant, take a look on Meta_InputTextCallback(...) where I have a hack (forced heap storage) instead of nice .resize() - due to: #190

btw:

  • madX::Meta::String is using cista::raw::string
  • constexpr cista::generic_string<>::msize_t madX::Meta::StringShortLength = (cista::generic_string<>::short_length_limit + 1);
  • all my default initialization are: Meta::String("", madX::Meta::StringShortLength) to make ImGui::InputTextWithHint(...) happy;

@ChemistAion
Copy link
Author

I will check the impact here of what @khng300 did in the: #187

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant