Thread overview
Yeni staticMap Uygulaması
Feb 09, 2023
Salih Dincer
Feb 09, 2023
Ali Çehreli
Feb 10, 2023
Salih Dincer
February 09, 2023

Merhaba,

İşte ben buna iş birliği derim çünkü yabancı biri işaret edip Ali hocanın çözüm bulması ve onun geliştirmesi ile şahane bir şey şurada açığa çıktı:

import std.meta;

template statikMap(size_t N, alias fun, args...)
if(args.length % N == 0) {
  alias statikMap = AliasSeq!();
  static foreach (i; 0..args.length / N) {
    static if (N == 1) {
      statikMap = AliasSeq!(statikMap, fun!(
        args[i]
      ));
    } else static if (N == 2) {
    statikMap = AliasSeq!(statikMap, fun!(
        args[0..$ / N][i],
        args[$ / N..($ / N) * 2][i]
      ));
    } else static if (N == 3) {
      statikMap = AliasSeq!(statikMap, fun!(
        args[0..$ / N][i],
        args[$ / N..($ / N) * 2][i],
        args[($ / N) * 2..($ / N) * 3][i]
      ));
    }
  }
}

alias T = AliasSeq!(byte, short, int);
alias V = AliasSeq!(1, 2, 4);
alias B = AliasSeq!("8 bit", "16 bit", "32 bit");

void main()
{
	struct Birli(T)
	{
		T data;
	}

	struct İkili(T, size_t s)
	{
		T[s] data;
	}

	struct Kimlikli(T, size_t s, string str)
	{
		T[s] data;
		enum id = str;
	}

	statikMap!(1, Birli, T) values;
	assert(is(typeof(values[0].data) == byte));
	assert(is(typeof(values[1].data) == short));
	assert(is(typeof(values[2].data) == int));

	statikMap!(2, İkili, T, V) arrays;
	assert(arrays[0].data.length == 1);
	assert(arrays[1].data.length == 2);
	assert(arrays[2].data.length == 4);
	
	statikMap!(3, Kimlikli, T, V, B) kimlikliDizi;
	
	import std.stdio;
	with(kimlikliDizi[0]) id.writeln(" x ", data.length);
	with(kimlikliDizi[1]) id.writeln(" x ", data.length);
	with(kimlikliDizi[2]) id.writeln(" x ", data.length);
}/* ÇIKTISI:
dmd -run "staticMap123.d" (in directory: /home/user/Documents/Ddili/sdb)

8 bit x 1
16 bit x 2
32 bit x 4

   */

Kaydedin bir köşeye! Özellikle de nitelikli (kimlikli) olan yani üçlüsü şahane. Bilmem soruyu soran için 4'lü 5'li ne gerek var dedirtiyor ama Tuple ve kendi türlerimiz ile yapılan harika bir olanak.

Başarılar...

February 09, 2023
On 2/8/23 23:24, Salih Dincer wrote:

> Bilmem soruyu soran için 4'lü 5'li ne gerek var dedirtiyor

Öte yandan, neden belirli bir sayıyla sınırlansın? Sınırsız bir genellemesini o konuya ekledim.

Ali

February 10, 2023
On Thursday, 9 February 2023 at 19:19:37 UTC, Ali Çehreli wrote:
> Sınırsız bir genellemesini o konuya ekledim.

Bunun standart kütüphaneye (std.meta)'ya entegre edilmesini önemle rica ederim. İsmi güzel:

alias staticMapN!(size_t argsPerElement, alias fun, TList...) = AliasSeq!();

Saygılar...