// check it out on Compiler Explorer : https://godbolt.org/
struct Delay
{
    virtual void wait() = 0;
};


struct FreeRTOS_Delay : Delay
{
    void wait() override
    {
        _wait();
    }
    private:
    static void _wait()
    {
        for(volatile int i = 0; i < 10; i++);
    }
};

struct STM_Hal_Delay : Delay
{
        void wait() override
    {
        _wait();
    }
    private:
    static void _wait()
    {
        // systick stuff here
        for(volatile int i = 0; i < 1000; i++);
    }
};


int main()
{
    FreeRTOS_Delay dly;

    dly.wait();
    return 0;
}

