🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #310525

Re: stała mapa enum -> wartość

#310525
From: JDX
Date: Wed, 13 Mar 2024 00:19
76 lines
3841 bytes
On 12.03.2024 08:23, heby wrote:
> On 12/03/2024 07:56, JDX wrote:
>> https://stackoverflow.com/questions/33374241/compile-time-lookup-table-for-enum. Zwłaszcza jedno zdanie zwróciło moją uwagę (o czym w zasadzie wiedziałem, ale jakoś nie przyszło mi to do głowy): „In C++14, your switch function could be constexpr, thanks to relaxed constexpr restrictions” – ja bym właśnie z constexpr spróbował się pobawić.
> 
> Nie spradzałem tego konkretnego rozwiązania jeszcze, zerknę.
A ja z ciekawości właśnie sprawdziłem i wygląda na to, że działa. A w 
bonusie jest zerowe zużycie pamięci (nie trzeba tablicy).

-----------------------------------------------------------------
// Kompilacja: g++ -std=c++20 -O3 -Wall -S testenum.cpp

#include <cstdint>
#include <type_traits>

enum class Foo : uint8_t { D, U, P, A };

struct Bar {
	uint8_t   a;
	uint32_t  b;
	constexpr Bar(uint8_t _a, uint32_t _b) : a(_a), b(_b) {}
};

template<Foo> struct Foo2Bar;

// "Tablica" mapujaca Foo -> Bar
template<> struct Foo2Bar<Foo::D> : std::integral_constant<Bar, 
Bar(7,3)> { };
template<> struct Foo2Bar<Foo::U> : std::integral_constant<Bar, 
Bar(0,0)> { };
template<> struct Foo2Bar<Foo::P> : std::integral_constant<Bar, 
Bar(2,3)> { };
template<> struct Foo2Bar<Foo::A> : std::integral_constant<Bar, 
Bar(1,5)> { };

int footest()
{
	// oczekiwana wartosc zwracana: 21
	static_assert(
		Foo2Bar<Foo::D>::value.a + Foo2Bar<Foo::D>::value.b +
		Foo2Bar<Foo::U>::value.a + Foo2Bar<Foo::U>::value.b +
		Foo2Bar<Foo::P>::value.a + Foo2Bar<Foo::P>::value.b +
		Foo2Bar<Foo::A>::value.a + Foo2Bar<Foo::A>::value.b == 21, "");

	return 	Foo2Bar<Foo::D>::value.a + Foo2Bar<Foo::D>::value.b +
			Foo2Bar<Foo::U>::value.a + Foo2Bar<Foo::U>::value.b +
			Foo2Bar<Foo::P>::value.a + Foo2Bar<Foo::P>::value.b +
			Foo2Bar<Foo::A>::value.a + Foo2Bar<Foo::A>::value.b;
}

const Bar& bartest()
{
	return Foo2Bar<Foo::D>::value;
}
-----------------------------------------------------------------

Dla typów prostych nie potrzeba -std=c++20. W każdym razie np. dla ARM-a 
footest() wygląda tak:
	.global	_Z7footestv
	.syntax unified
	.arm
	.type	_Z7footestv, %function
_Z7footestv:
	.fnstart
.LFB14:
	@ Function supports interworking.
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 0, uses_anonymous_args = 0
	@ link register save eliminated.
	mov	r0, #21
	bx	lr
	.cantunwind
	.fnend
	.size	_Z7footestv, .-_Z7footestv

Przy optymalizacji -O0 ładnie widać jak pracowicie są dodawane 
poszczególne stałe.
Technical Details
Message-ID: <usqrds$qke$1$jdx@news.chmurka.net>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.ip-94-42-224-83.multimo.pl!not-for-mail
References: <usk0pv$2tak9$1@dont-email.me> <uslhop$tf6$1$Jaworski@news.chmurka.net> <usn89d$3me9n$1@dont-email.me> <usnat5$dmp$1$jdx@news.chmurka.net> <usnbua$3n64i$1@dont-email.me> <usouai$qsc$1$jdx@news.chmurka.net> <usovtu$5lca$1@dont-email.me>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.ip-94-42-224-83.multimo.pl!not-for-mail
From: JDX <jdx@onet.pl>
Newsgroups: pl.comp.lang.c
Subject: Re: stała mapa enum -> wartość
Date: Wed, 13 Mar 2024 01:19:07 +0100
Organization: N/A
Message-ID: <usqrds$qke$1$jdx@news.chmurka.net>
References: <usk0pv$2tak9$1@dont-email.me> <uslhop$tf6$1$Jaworski@news.chmurka.net> <usn89d$3me9n$1@dont-email.me> <usnat5$dmp$1$jdx@news.chmurka.net> <usnbua$3n64i$1@dont-email.me> <usouai$qsc$1$jdx@news.chmurka.net> <usovtu$5lca$1@dont-email.me>
NNTP-Posting-Host: ip-94-42-224-83.multimo.pl
MIME-Version: 1.0
Injection-Date: Wed, 13 Mar 2024 00:19:08 -0000 (UTC)
Injection-Info: news.chmurka.net; posting-account="jdx"; posting-host="ip-94-42-224-83.multimo.pl:94.42.224.83"; logging-data="27278"; mail-complaints-to="abuse-news.(at).chmurka.net"
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:FctPVSFWf0lBl8xBsFfrciwICBc= sha256:LtK3GOXnvjHX73kVUAdXvSVAWQaLtk3HhFllcujeics= sha1:nZll4290p1sFIOOdKpVc/l3AqpQ= sha256:LM06+NbDdhq6tlGFIX4KVr+LQJbSBH0BpLOnuki9phw=
In-Reply-To: <usovtu$5lca$1@dont-email.me>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit