February 21, 2013

Merhaba,

Bugün kendimce, D'nin tüm olanakları (belki de değil...:)) kullanıldığında nasıl karmaşık yapıların üstesinden gelinebildiğini deneyimlemek istedim. İnsanın ilk aklına doğal olarak matrisler geliyor. Ayrıca şu sıralar çalıştığım konu bitler olunca aşağıdaki gibi basit bir şey çıktı:

Alıntı ("testcode.d"):

>
> import std.stdio, dersler.advancedstructs;
> // dmd derstest dersler/advancedstructs -unittest
>
> void main() {
>   //auto test = byteX!(ubyte, 3).LOW;/* <-- bitXb72.LOW'a eşit
>   auto test = bitXs64.HIGH;//*/
>
>   with(test.satır[0]) {
>     a.writeln("<-- HIGH ile kurulmuştu...");
>     a = 153;
>     writefln("%b BIN 153'e eşitlendi!", a);
>   }
>
>   test.satır[1].b = 35;
>
>   "==========================".writeln;
>   foreach(s; test.satır) {
>     foreach(d; s.data) d.write("\t");
>     writeln;
>   }
>   "==========================".writeln;
> }/*
> 65535<-- HIGH ile kurulmuştu...
> 10011001 BIN 153'e eşitlendi!
> ==========================
> 153      65535  (1.satır)
> 65535    35     (2.satır)
> ==========================
> */
> ```

>
**Not:** Karmaşık gibi göründüğüne bakmayın, açıklayacağım. O yüzden ilk olarak, alias ile modül içinde tanımlanmış takma ismi bir değişkene eşitlemek kadar, kullanmanın kolay olduğu örneğe yer verdim...:)

İşte o modül:

module dersler.advancedstructs;

alias byteX!(ubyte, 2) bitXb32;
alias byteX!(ushort, 2) bitXs64;
alias byteX!(ubyte, 3) bitXb72;
alias byteX!(ubyte, 4) bitX1b28;

alias byteX!(ushort, 3) bitXs144;
alias byteX!(ushort, 4) bitXs256;

alias byteX!(uint, 3) bitXi288;
alias byteX!(uint, 4) bitXi512;

alias byteX!(ulong, 3) bitXl576;
alias byteX!(ulong, 4) bitXl1Kb;

struct byteX(T, size_t adet)
if( ( adet >= 2 ) && ( adet <= 4 ) )
{
static enum size_t boyut = adet * adet;

private alias bitX!(T, adet) Veri;

union {
T hücreler[boyut];
Veri satır[adet];
}

static if( adet == 2 ) { // 2 x 2
public static enum byteX!(T, adet) LOW = byteX!(T, adet)(
[T.min, T.min,
T.min, T.min]);

public static enum byteX!(T, adet) HIGH = byteX!(T, adet)(
[T.max, T.max,
T.max, T.max]);
}
static if( adet == 3 ) { // 3 x 3
public static enum byteX!(T, adet) LOW = byteX!(T, adet)(
[T.min, T.min, T.min,
T.min, T.min, T.min,
T.min, T.min, T.min]);

public static enum byteX!(T, adet) HIGH = byteX!(T, adet)(
[T.max, T.max, T.max,
T.max, T.max, T.max,
T.max, T.max, T.max]);
}
static if( adet == 4 ) { // 4 x 4
public static enum byteX!(T, adet) LOW = byteX!(T, adet)(
[T.min, T.min, T.min, T.min,
T.min, T.min, T.min, T.min,
T.min, T.min, T.min, T.min,
T.min, T.min, T.min, T.min]);

public static enum byteX!(T, adet) HIGH = byteX!(T, adet)(
[T.max, T.max, T.max, T.max,
T.max, T.max, T.max, T.max,
T.max, T.max, T.max, T.max,
T.max, T.max, T.max, T.max]);
}
}

/* Samples:

  • (ubyte, 2) => 16 bits
  • (ubyte, 3) => 24 bits
  • (ubyte, 4) => 32 bits
    */

struct bitX(T, size_t adet) {
union {
T data[adet];
struct {
static if(adet >= 1) T a;
static if(adet >= 2) T b;
static if(adet >= 3) T c;
static if(adet >= 4) T d;
}
}
}



-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]