Commit 80de3add authored by tqcq's avatar tqcq
Browse files

feat add ioc

parent 4ad27532
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -195,7 +195,8 @@ if(SLED_BUILD_TESTS)
  sled_add_test(NAME sled_string_view_test SRCS
                src/sled/nonstd/string_view_test.cc)
  sled_add_test(NAME sled_expected_test SRCS src/sled/nonstd/expected_test.cc)
  sled_add_test(NAME sled_config_test SRCS src/sled//config_test.cc)
  sled_add_test(NAME sled_config_test SRCS src/sled/config_test.cc)
  sled_add_test(NAME sled_ioc_test SRCS src/sled/ioc/ioc_test.cc)
endif(SLED_BUILD_TESTS)

if(SLED_BUILD_FUZZ)

src/sled/ioc/ioc.h

0 → 100644
+933 −0

File added.

Preview size limit exceeded, changes collapsed.

+64 −0
Original line number Diff line number Diff line
#include <sled/ioc/ioc.h>
#include <string>

class IRunner {
public:
    virtual ~IRunner()     = default;
    virtual int RunSpeed() = 0;
};

class IWalker {
public:
    virtual ~IWalker() {}

    virtual int WalkSpeed() = 0;
};

class Cheetah : public IRunner, public IWalker {
public:
    int WalkSpeed() override { return 4; }

    int RunSpeed() override { return 100; }
};

class Formatter {
public:
    std::string Format(int value) { return std::to_string(value); }
};

class Service {
public:
    Service(std::shared_ptr<Formatter> formatter) : formatter_(formatter) {}

    std::string Format(int value) { return formatter_->Format(value); }

private:
    std::shared_ptr<Formatter> formatter_;
};

TEST_SUITE("Inversion Of Control")
{
    TEST_CASE("base")
    {
        sled::ioc::Container container;
        container.Bind<IRunner, IWalker>().To<Cheetah>();
        auto runner = container.Get<IRunner>();
        auto walker = container.Get<IWalker>();
        CHECK(runner);
        CHECK(walker);
        CHECK_EQ(runner.use_count(), 1);
        CHECK_EQ(walker.use_count(), 1);
        CHECK_EQ(runner->RunSpeed(), 100);
        CHECK_EQ(walker->WalkSpeed(), 4);
    }

    TEST_CASE("deps")
    {
        sled::ioc::Container container;
        container.Bind<Formatter>().ToSelf();
        container.Bind<Service>().ToSelf();
        auto service = container.Get<Service>();
        CHECK_EQ(service->Format(42), "42");
        CHECK_EQ(service->Format(44), "44");
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@

// futures
// #include "sled/futures/promise.h"
#include "sled/ioc/ioc.h"

// lang
#include "sled/lang/attributes.h"