CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
124 lines
2.2 KiB
C++
124 lines
2.2 KiB
C++
// Copyright Advanced Micro Devices, Inc., or its affiliates.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#include <sstream>
|
|
#include <variant>
|
|
|
|
#include <rocRoller/Utilities/Generator.hpp>
|
|
|
|
#include "SimpleFixture.hpp"
|
|
|
|
using namespace rocRoller;
|
|
|
|
using Foo = std::variant<int, float, std::string>;
|
|
|
|
class VariantTest : public SimpleFixture
|
|
{
|
|
};
|
|
|
|
struct ConvertToString
|
|
{
|
|
template <typename T>
|
|
std::string operator()(T const& val) const
|
|
{
|
|
std::ostringstream msg;
|
|
msg << val;
|
|
return msg.str();
|
|
}
|
|
};
|
|
|
|
struct YieldCharacters
|
|
{
|
|
template <typename T>
|
|
Generator<char> operator()(T const& val) const
|
|
{
|
|
std::ostringstream msg;
|
|
msg << val;
|
|
auto str = msg.str();
|
|
for(auto const& c : str)
|
|
co_yield c;
|
|
}
|
|
};
|
|
|
|
struct PrintIt
|
|
{
|
|
void operator()(int val) const
|
|
{
|
|
std::cout << val;
|
|
}
|
|
|
|
void operator()(float val) const
|
|
{
|
|
std::cout << val;
|
|
}
|
|
|
|
void operator()(std::string const& val) const
|
|
{
|
|
std::cout << val;
|
|
}
|
|
};
|
|
|
|
TEST_F(VariantTest, Basic)
|
|
{
|
|
Foo f("four");
|
|
|
|
EXPECT_EQ("four", std::get<std::string>(f));
|
|
|
|
Foo g(2);
|
|
PrintIt printer;
|
|
std::visit(printer, g);
|
|
|
|
// std::visit([](auto v){std::cout << v;}, g);
|
|
|
|
EXPECT_EQ("2", std::visit(ConvertToString(), g));
|
|
|
|
std::string str;
|
|
for(auto c : std::visit(YieldCharacters(), g))
|
|
{
|
|
// cppcheck-suppress useStlAlgorithm
|
|
str += c;
|
|
}
|
|
|
|
EXPECT_EQ("2", str);
|
|
|
|
auto coroutine = std::visit(YieldCharacters(), f);
|
|
str = std::string(coroutine.begin(), coroutine.end());
|
|
|
|
EXPECT_EQ("four", str);
|
|
}
|
|
|
|
struct AddIt
|
|
{
|
|
void operator()(int& val) const
|
|
{
|
|
val++;
|
|
}
|
|
|
|
void operator()(float& val) const
|
|
{
|
|
val += 0.5f;
|
|
}
|
|
|
|
void operator()(std::string& val) const
|
|
{
|
|
val = val + " point five";
|
|
}
|
|
};
|
|
|
|
TEST_F(VariantTest, Reference)
|
|
{
|
|
AddIt adder;
|
|
|
|
Foo val = 1;
|
|
std::visit(adder, val);
|
|
EXPECT_EQ("2", std::visit(ConvertToString(), val));
|
|
|
|
val = 2.0f;
|
|
std::visit(adder, val);
|
|
EXPECT_EQ("2.5", std::visit(ConvertToString(), val));
|
|
|
|
val = "three";
|
|
std::visit(adder, val);
|
|
EXPECT_EQ("three point five", std::visit(ConvertToString(), val));
|
|
}
|