<commit_before>#ifndef context_hh_INCLUDED
#define context_hh_INCLUDED

#include "window.hh"

namespace Kakoune
{

class Buffer;

struct Context
{
    Context() {}
    Context(Editor& editor)
        : m_editor(&editor), m_buffer(&editor.buffer()) {}

    // to allow func(Context(Editor(...)))
    Context(Editor&& editor)
        : m_editor(&editor), m_buffer(&editor.buffer()) {}

    Buffer& buffer() const
    {
        if (not has_buffer())
            throw runtime_error("no buffer in context");
        return *m_buffer;
    }
    bool has_buffer() const { return m_buffer; }

    Editor& editor() const
    {
        if (not has_editor())
            throw runtime_error("no editor in context");
        return *m_editor.get();
    }
    bool has_editor() const { return m_editor; }

    Window& window() const
    {
        if (not has_window())
            throw runtime_error("no window in context");
        return *dynamic_cast<Window*>(m_editor.get());
    }
    bool has_window() const { return m_editor and dynamic_cast<Window*>(m_editor.get()); }

    OptionManager& option_manager() const
    {
        if (has_window())
            return window().option_manager();
        if (has_buffer())
            return buffer().option_manager();
        return GlobalOptionManager::instance();
    }

    int numeric_param() const { return m_numeric_param; }
    void numeric_param(int param) { m_numeric_param = param; }

public:
    safe_ptr<Editor> m_editor;
    safe_ptr<Buffer> m_buffer;

    int m_numeric_param = 0;
};

}
#endif // context_hh_INCLUDED<commit_msg>Context: do not store buffer, ask editor for it<commit_after>#ifndef context_hh_INCLUDED
#define context_hh_INCLUDED

#include "window.hh"

namespace Kakoune
{

class Buffer;

struct Context
{
    Context() {}
    Context(Editor& editor)
        : m_editor(&editor) {}

    // to allow func(Context(Editor(...)))
    Context(Editor&& editor)
        : m_editor(&editor) {}

    Buffer& buffer() const
    {
        if (not has_buffer())
            throw runtime_error("no buffer in context");
        return m_editor->buffer();
    }
    bool has_buffer() const { return m_editor; }

    Editor& editor() const
    {
        if (not has_editor())
            throw runtime_error("no editor in context");
        return *m_editor.get();
    }
    bool has_editor() const { return m_editor; }

    Window& window() const
    {
        if (not has_window())
            throw runtime_error("no window in context");
        return *dynamic_cast<Window*>(m_editor.get());
    }
    bool has_window() const { return m_editor and dynamic_cast<Window*>(m_editor.get()); }

    OptionManager& option_manager() const
    {
        if (has_window())
            return window().option_manager();
        if (has_buffer())
            return buffer().option_manager();
        return GlobalOptionManager::instance();
    }

    int numeric_param() const { return m_numeric_param; }
    void numeric_param(int param) { m_numeric_param = param; }

public:
    safe_ptr<Editor> m_editor;
    int m_numeric_param = 0;
};

}
#endif // context_hh_INCLUDED
{'fraction_non_alphanumeric': 0.12303748798462032, 'fraction_numerical': 0.0006408202499198974, 'mean_word_length': 2.7659831121833536, 'pattern_counts': {'":': 0, '<': 10, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3985443', 'n_tokens_mistral': 943, 'n_tokens_neox': 923, 'n_words': 229}