[OT] What are D's values?

Dukc ajieskola at gmail.com
Sun Oct 10 13:13:21 UTC 2021


On Saturday, 9 October 2021 at 06:50:19 UTC, Paulo Pinto wrote:
>
> You can simulate scope(exit) with an helper struct.
>
> [snip]
>
> Naturally D's scope(exist) is cleaner to write.

Lol, I haven't done this put my C# definitely shows I wish I had 
a D compiler (and understand C# a bit poorly). This is a somewhat 
outdated C# compiler, not all of the newest tricks are available:

```C#
public struct Ui
{   //...
}

// elsewhere

abstract class Panel
{   // ...
     public Ui[] uiState;
     // ...
}
```

The story behind that array is that I wanted a reference to the 
struct. Later on I came up with a less hackish way to achieve the 
same:

```C#
//Intended for the same as C standard library div_t: result of 
division.
public struct DivInt
{   public int quot;
     public int rem;
}

public class Ref<Struct>
{   public Struct value;
     public Ref(){}
     public Ref(Struct val){value = val;}
}
```

Other examples of my programming:

```C#
public static class Utility
{   //Because Debug.Assert message does not pop up on web page
     [System.Diagnostics.Conditional("DEBUG")]
     public static void Assert (bool condition)
     {   Assert(condition, "Program in illegal state. Exiting.");
     }

     [System.Diagnostics.Conditional("DEBUG")]
     public static void Assert (bool condition, string message)
     {   if (!condition)
         {   Window.Alert(message);
             throw new InvalidOperationException();
         }
     }

     public static void Swap<T>(ref T a, ref T b)
     {   var temp = a;
         a = b;
         b = temp;
     }

     //don't use to add many elements sequentially in a loop, as 
that's inefficient.
     public static void Append<T>(ref T[] array, T what)
     {   var oldLength = array.Length;
         Array.Resize(ref array, oldLength + 1);
         array[oldLength] = what;
     }

      //always rounds down, also when negative.
     public static DivInt Div(this int dividee, int divisor)
     {   int quot;
         int rem;
         // Could this be assigned directly to the result value?
         quot = Math.DivRem(dividee, divisor, out rem);

         if(rem < 0)
         {   quot--;
             rem += divisor;
         }
         return new DivInt{quot = quot, rem = rem};
     }

     public static void Each<T>(this IEnumerable<T> range, 
Action<T> todo)
     {   foreach(T el in range) todo(el);
     }

     public static IEnumerable<Sequence<T, int>> Enumerate<T>(this 
IEnumerable<T> range, int startValue)
     {   return range.Zip(Enumerable.Range(startValue, 
int.MaxValue), (x, y) => new Sequence<T, int>(x, y));
     }

     public static IEnumerable<Sequence<T, int>> Enumerate<T>(this 
IEnumerable<T> range)
     {   return range.Enumerate(0);
     }
}
```

My way of serializing and deserializing data to/from files would 
probably get red pen marks from fairly much everything. 
Representive deserialization here, struct data is commented in 
real life but not here because didn't bother to translate:

```C#
public struct PillarInstallation
{   public Slab pillar;
     public Vector3D gap;
     public float angle;
     public Ref<StoneCutType>[] sideCutTypes

     // other member functions...

public static PillarInstallation Deserialize
     (   byte[] from,
         int fromI,
         YhkVersion yhkVersion,
         int pillarI,
         Dictionary<string, int> textureChecker
     )
     {   int fromIAtStart = fromI;
         PillarInstallation result = new PillarInstallation();

         result.pillar = Slab.Deserialize(from, fromI, 
textureChecker);
         fromI += Slab.serializedSize;

         result.gap = Vector3D.Deserialize(from, fromI);
         fromI += Vector3D.serializedSize;

         if (yhkVersion.Encompasses(new YhkVersion(8)))
         {   result.angle = Utility.DeserializeFloat(from, fromI);
             fromI += 4;
         } else result.angle = 0;

         result.sideCutTypes = new Ref<StoneCutType>[2];
         if (yhkVersion.Encompasses(new YhkVersion(12)))
         {   for(int i=0; i<result.sideCutTypes.Length; i++) 
if(from[fromI+i]!=255)
             {   var refVar = new Ref<StoneCutType>();
                 refVar.value = (StoneCutType)from[fromI+i];
                 result.sideCutTypes[i] = refVar;
             }
         } else
         {   bool interfaceSawed = Utility.DeserializeInt(from, 
fromI) % 2 > 0;
             if (interfaceSawed)
             {   var refVar = new 
Ref<StoneCutType>(StoneCutType.sawed);
                 result.sideCutTypes[pillarI^1] = refVar;
             }
         }


         fromI += 4;

         Utility.Assert(fromIAtStart + 
GetSerializedSize(yhkVersion) == fromI, "read " + (fromI - 
fromIAtStart) + " bytes, should have read " + 
GetSerializedSize(yhkVersion));
         return result;
     }
}
```


More information about the Digitalmars-d mailing list