<commit_before>/************************************************
 * libgo sample12
 ************************************************
 * 这是一个协程监听器的例子
 * 使用协程监听器 co_listener 可以监听协程的
 * 创建销毁等事件，也可以进行异常处理
 ************************************************/
#include "coroutine.h"
#include <iostream>

using namespace std;

//协程监听器的调用过程：
//                          (正常运行完成)
//                      ---> onCompleted -->
//                      |                  |
// onCreated --> onStart                   ---> onFinished
//                      |                  |
//                      ---> onException -->
//                     (运行时抛出未捕获的异常)
//
//！！注意协程监听器回调方法均不能抛出异常，如果可能有异常抛出，请在回调方法内自行 try...catch 消化掉

//覆盖 co::co_listener 的虚函数实现回调方法
class CoListenerSample: public co_listener {
public:
    /**
     * 协程被创建时被调用
     * （注意此时并未运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onCreated(uint64_t task_id) noexcept {
        cout << "onCreated task_id=" << task_id << endl;
    }

    /**
     * 协程开始运行
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onStart(uint64_t task_id) noexcept {
        cout << "onStart task_id=" << task_id << endl;
    }

    /**
     * 协程切入后（包括协程首次运行的时候）调用
     * 协程首次运行会在onStart之前调用。
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onSwapIn(uint64_t task_id) noexcept {
        cout << "onSwapIn task_id=" << task_id << endl;
    }

    /**
     * 协程切出前调用
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onSwapOut(uint64_t task_id) noexcept {
        cout << "onSwapOut task_id=" << task_id << endl;
    }

    /**
     * 协程正常运行结束（无异常抛出）
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     */
    virtual void onCompleted(uint64_t task_id) noexcept {
        cout << "onCompleted task_id=" << task_id << endl;
    }

    /**
     * 协程抛出未被捕获的异常（本方法运行在协程中）
     * @prarm task_id 协程ID
     * @prarm eptr 抛出的异常对象指针，可对本指针赋值以修改异常对象，
     *             异常将使用 CoroutineOptions.exception_handle 中
     *             配置的方式处理；赋值为nullptr则表示忽略此异常
     *             ！！注意：当 exception_handle 配置为 immedaitely_throw 时本事件<commit_msg>sample12_listener.cpp: comment change<commit_after>/************************************************
 * libgo sample12
 ************************************************
 * 这是一个协程监听器的例子
 * 使用协程监听器 co_listener 可以监听协程的
 * 创建销毁等事件，也可以进行异常处理
 ************************************************/
#include "coroutine.h"
#include <iostream>

using namespace std;

//协程监听器的调用过程：
// s: Scheduler，表示该方法运行在调度器上下文中
// c: Coroutine，表示该方法运行在协程上下文中
//                                             (正常运行完成)
//                                           -->[c]onCompleted->
//                                          |                   |
// [s]onCreated-->[s]onSwapIn-->[c]onStart->*--->[c]onSwapOut-- -->[c]onFinished-->[c]onSwapOut
//                                          |\                | |
//                                          | \<-[s]onSwapIn--V |
//                                          |                   |
//                                           -->[c]onException->               
//
//！！注意协程监听器回调方法均不能抛出异常，如果可能有异常抛出，请在回调方法内自行 try...catch 消化掉

//覆盖 co::co_listener 的虚函数实现回调方法
class CoListenerSample: public co_listener {
public:
    /**
     * 协程被创建时被调用
     * （注意此时并未运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onCreated(uint64_t task_id) noexcept {
        cout << "onCreated task_id=" << task_id << endl;
    }

    /**
     * 每次协程切入前调用
     * （注意此时并未运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onSwapIn(uint64_t task_id) noexcept {
        cout << "onSwapIn task_id=" << task_id << endl;
    }
    
    /**
     * 协程开始运行
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onStart(uint64_t task_id) noexcept {
        cout << "onStart task_id=" << task_id << endl;
    }

    /**
     * 每次协程切出前调用
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     * @prarm eptr
     */
    virtual void onSwapOut(uint64_t task_id) noexcept {
        cout << "onSwapOut task_id=" << task_id << endl;
    }

    /**
     * 协程正常运行结束（无异常抛出）
     * （本方法运行在协程中）
     *
     * @prarm task_id 协程ID
     */
    virtual void onCompleted(uint64_t task_id) noexcept {
        cout << "onCompleted task_id=" << task_id << endl;
    }

    /**
     * 协程抛出未被捕获的异常（本方法运行在协程中）
     * @prarm task_id 协程ID
     * @prarm eptr 抛出的异常对象指针，可对本指针赋值以修改异常对象，
     *             异常将使用 CoroutineOptions.exception_handle 中
     *             配置的方式处理；赋值为nullptr则表示忽略此异常
     *             ！！注意：当 exception_handle 配置为 immedaitely_throw 时本事件
{'fraction_non_alphanumeric': 0.1725580422505752, 'fraction_numerical': 0.005438192846684794, 'mean_word_length': 1.6730016769144773, 'pattern_counts': {'":': 0, '<': 66, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 16, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6250750', 'n_tokens_mistral': 1987, 'n_tokens_neox': 2129, 'n_words': 271}