Thanks for your reply,

2012/7/19 [email protected] <[email protected]>

> > pointers are missing too.
>
> That isn't true see:
>
> https://live.gnome.org/Vala/Tutorial#Pointers
>

I missed them the first time. Good to know they're available.

Something along this code
> should also works (it's not required to derive from Reg16, anyway):
>
>
> using GLib;
>
> namespace NoUnion {
>         public struct Reg16 {
>                 public uint16
> reg16;
>         }
>
>         public struct Word : Reg16 {
>                 public uint8 get_lo () {
> return (uint8) (reg16 & 0xFF); }
>                 public void set_lo (uint8 value) {
> reg16 = (reg16 & 0xFF00) | value; }
>
>                 public uint8 get_hi () {
> return (uint8) (reg16 >> 8); }
>                 public void set_hi (uint8 value) {
> reg16 = (reg16 & 0xFF) | (value << 8); }
>         }
>
>         public static int main
> (string[] args) {
>                 Word word = Word();
>
>                 word.reg16 = 2;
>
>                 word.
> set_lo (word.get_lo () + 1);
>                 word.set_hi (1);
>
>                 stdout.printf
> ("word.lo = %d | word.hi = %d | word.reg16 = %d | sizeof(Word) = %lu",
> word.get_lo (), word.get_hi (), word.reg16, sizeof(Word));
>                 return 0;
>
> }
> }
>

This actually works efficiently. I worked out a solution involving a class
and pointers:

    public class Reg
    {
        private uint16 _hl;
        private uint8 *_h;
        private uint8 *_l;

        public uint16 Value
        {
            get { return _hl; }
            set { _hl = value; }
        }

        public uint8 High
        {
            get { return *_h; }
            set { *_h = value; }
        }

        public uint8 Low
        {
            get { return *_l; }
            set { *_l = value; }
        }

        public Reg()
        {
            uint16 *_tmp16 = &_hl;

            _h = (uint8 *)(((ulong)(_tmp16)) + 1);
            _l = (uint8 *)((ulong)(_tmp16));
        }
    }

My solution is far slower (declaring my class is at least one of magnitude
slower than declaring your struct; manipulation is between 1.5 and 2 times
slower), but I find it nicer because I can do things like:
     reg.Low += 1;
instead of:
    word.set_lo (word.get_lo () + 1);

Once said that, though, I think I'll go with your solution as I'm seeing
that my class's low performance becomes an issue.

Thanks again

--
nadir
_______________________________________________
vala-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to