It is currently Sun May 31, 2020 1:32 am

All times are UTC + 1 hour




Post new topic Reply to topic  [ 11 posts ] 
Author Message
 Post subject: EnumerationBinary
PostPosted: Thu May 07, 2020 11:19 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Sun Jul 07, 2013 11:35 am
Posts: 511
Location: Canada
Hello everyone,

I think the compiler should raise a warning if the EnumerationBinary has more than 63 constants. The values will exceed the quad capacity pass the 63rd constants anyway. Maybe this can be raise if we get 128 bit integers in the future but for now 63 constants seems fair enough.

Best regards
StarBootics

_________________
The Stone Age did not end due to a shortage of stones !


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Fri May 08, 2020 8:32 am 
Offline
Addict
Addict
User avatar

Joined: Thu Feb 09, 2006 11:27 pm
Posts: 2544
A lot of additional warnings would be helpful, what I am doing some and when is a combination StartVectorDrawing(...) and StopDrawing() which works with no error but also with no output :shock:...

Maybe something like that two variants could help in critical situations?
Code:
#EnumerationMaximum=10

Macro C1(zzz)
   zzz
   CompilerIf #PB_Compiler_EnumerationValue>#EnumerationMaximum : EndEnumeration : Debug "PANIC" : Enumeration : CompilerEndIf
EndMacro
Macro C2()
   : CompilerIf #PB_Compiler_EnumerationValue>#EnumerationMaximum : EndEnumeration : Debug "PANIC"
   Enumeration
   CompilerEndIf
EndMacro

EnumerationBinary
   C1(#A)
   C1(#B)
   C1(#C)
   #D   C2()
   #E_   C2()
   #F   C2()
EndEnumeration

Debug #a
Debug #b
Debug #c
Debug #d
Debug #e_
Debug #f


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Fri May 08, 2020 8:22 pm 
Offline
Enthusiast
Enthusiast

Joined: Thu Mar 09, 2006 9:24 am
Posts: 284
Location: S. Kor
The following code is a kind of hack using #PB_Compiler_Line.

Caution !
1. Nothing should be added between "BinEnum" and "EndBinEnum" other than the constants. No empty lines !
2. The ":" character for the command concatenation should not be used between "BinEnum" and "EndBinEnum".
3. The "=" character to alter a value should not be used.

Code:
Macro BinEnum
  CompilerIf #PB_Compiler_Version = 572 ;And #PB_Compiler_OS = #PB_OS_Windows
    #___BinEnumLineLimit = 65
  CompilerEndIf
  #___BinEnumLineStart_#MacroExpandedCount = #PB_Compiler_Line
  EnumerationBinary
EndMacro

Macro EndBinEnum
  EndEnumeration
  #___BinEnumLineEnd_#MacroExpandedCount = #PB_Compiler_Line
  CompilerIf #___BinEnumLineEnd_#MacroExpandedCount - #___BinEnumLineStart_#MacroExpandedCount > #___BinEnumLineLimit
    CompilerError "Exceed EnumerationBinary limitation !"
  CompilerEndIf
EndMacro

BinEnum
#a1
#a2
#a3
#a4
#a5
#a6
#a7
#a8
#a9
#a10
#a11
#a12
#a13
#a14
#a15
#a16
#a17
#a18
#a19
#a20
#a21
#a22
#a23
#a24
#a25
#a26
#a27
#a28
#a29
#a30
#a31
#a32
#a33
#a34
#a35
#a36
#a37
#a38
#a39
#a40
#a41
#a42
#a43
#a44
#a45
#a46
#a47
#a48
#a49
#a50
#a51
#a52
#a53
#a54
#a55
#a56
#a57
#a58
#a59
#a60
#a61
#a62
#a63
#a64
EndBinEnum

BinEnum
#b1
#b2
#b3
#b4
#b5
#b6
#b7
#b8
#b9
#b10
#b11
#b12
#b13
#b14
#b15
#b16
#b17
#b18
#b19
#b20
#b21
#b22
#b23
#b24
#b25
#b26
#b27
#b28
#b29
#b30
#b31
#b32
#b33
#b34
#b35
#b36
#b37
#b38
#b39
#b40
#b41
#b42
#b43
#b44
#b45
#b46
#b47
#b48
#b49
#b50
#b51
#b52
#b53
#b54
#b55
#b56
#b57
#b58
#b59
#b60
#b61
#b62
#b63
#b64
EndBinEnum

Debug CountString(Bin(#a64), "0")
Debug CountString(Bin(#b64), "0")


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Fri May 08, 2020 11:04 pm 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Sun Jul 07, 2013 11:35 am
Posts: 511
Location: Canada
Hello everyone,

Personally I prefer to have an enumeration already filled with 63 constants and comment the unused ones. Like that :
Code:
EnumerationBinary
 
  #CONSTANT_NAME_00
  #CONSTANT_NAME_01
  #CONSTANT_NAME_02
  #CONSTANT_NAME_03
  #CONSTANT_NAME_04
  #CONSTANT_NAME_05
  #CONSTANT_NAME_06
  #CONSTANT_NAME_07
  #CONSTANT_NAME_08
  #CONSTANT_NAME_09
  ;   #CONSTANT_NAME_10
  ;   #CONSTANT_NAME_11
  ;   #CONSTANT_NAME_12
  ;   #CONSTANT_NAME_13
  ;   #CONSTANT_NAME_14
  ;   #CONSTANT_NAME_15
  ;   #CONSTANT_NAME_16
  ;   #CONSTANT_NAME_17
  ;   #CONSTANT_NAME_18
  ;   #CONSTANT_NAME_19
  ;   #CONSTANT_NAME_20
  ;   #CONSTANT_NAME_21
  ;   #CONSTANT_NAME_22
  ;   #CONSTANT_NAME_23
  ;   #CONSTANT_NAME_24
  ;   #CONSTANT_NAME_25
  ;   #CONSTANT_NAME_26
  ;   #CONSTANT_NAME_27
  ;   #CONSTANT_NAME_28
  ;   #CONSTANT_NAME_29
  ;   #CONSTANT_NAME_30
  ;   #CONSTANT_NAME_31
  ;   #CONSTANT_NAME_32
  ;   #CONSTANT_NAME_33
  ;   #CONSTANT_NAME_34
  ;   #CONSTANT_NAME_35
  ;   #CONSTANT_NAME_36
  ;   #CONSTANT_NAME_37
  ;   #CONSTANT_NAME_38
  ;   #CONSTANT_NAME_39
  ;   #CONSTANT_NAME_40
  ;   #CONSTANT_NAME_41
  ;   #CONSTANT_NAME_42
  ;   #CONSTANT_NAME_43
  ;   #CONSTANT_NAME_44
  ;   #CONSTANT_NAME_45
  ;   #CONSTANT_NAME_46
  ;   #CONSTANT_NAME_47
  ;   #CONSTANT_NAME_48
  ;   #CONSTANT_NAME_49
  ;   #CONSTANT_NAME_50
  ;   #CONSTANT_NAME_51
  ;   #CONSTANT_NAME_52
  ;   #CONSTANT_NAME_53
  ;   #CONSTANT_NAME_54
  ;   #CONSTANT_NAME_55
  ;   #CONSTANT_NAME_56
  ;   #CONSTANT_NAME_57
  ;   #CONSTANT_NAME_58
  ;   #CONSTANT_NAME_59
  ;   #CONSTANT_NAME_60
  ;   #CONSTANT_NAME_61
  ;   #CONSTANT_NAME_62
 
EndEnumeration


Best regards
StarBootics

_________________
The Stone Age did not end due to a shortage of stones !


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Fri May 08, 2020 11:12 pm 
Offline
Addict
Addict
User avatar

Joined: Thu Feb 09, 2006 11:27 pm
Posts: 2544
Cool idea! Not sure, but couldn't it made without compiler lines also?

Code:
Macro BinEnum;(zzz=1)
   #___BinEnumLineStart_#MacroExpandedCount = 1;zzz
   EnumerationBinary
   EndMacro

   Macro EndBinEnum
      #___BinEnumLineEnd_#MacroExpandedCount = #PB_Compiler_EnumerationValue
   EndEnumeration
   Debug "$"+Hex(#___BinEnumLineEnd_#MacroExpandedCount)
   CompilerIf Bool(#___BinEnumLineEnd_#MacroExpandedCount>=0 And #___BinEnumLineEnd_#MacroExpandedCount<#___BinEnumLineStart_#MacroExpandedCount)
      CompilerError "Exceed EnumerationBinary limitation !"
   CompilerEndIf
EndMacro


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Fri May 08, 2020 11:55 pm 
Offline
Addict
Addict
User avatar

Joined: Sat Feb 13, 2010 3:45 pm
Posts: 1074
It always sends shivers down my spine when I see such constructs of macros. The code is hardly comprehensible and I don't even want to think about program maintenance after a few years. Why not use simple solutions like StarBootics or the following:

Code:
EnumerationBinary
  #CONSTANT_00
  #CONSTANT_01
  #CONSTANT_02
  #CONSTANT_03
  #CONSTANT_04
  #CONSTANT_05
  #CONSTANT_06
  #CONSTANT_07
  #CONSTANT_08
  #CONSTANT_09
  #CONSTANT_10
  #CONSTANT_11
  #CONSTANT_12
  #CONSTANT_13
  #CONSTANT_14
  #CONSTANT_15
  #CONSTANT_16
  #CONSTANT_17
  #CONSTANT_18
  #CONSTANT_19
  #CONSTANT_20
  #CONSTANT_21
  #CONSTANT_22
  #CONSTANT_23
  #CONSTANT_24
  #CONSTANT_25
  #CONSTANT_26
  #CONSTANT_27
  #CONSTANT_28
  #CONSTANT_29
  #CONSTANT_30
  #CONSTANT_31
  #CONSTANT_32
  #CONSTANT_33
  #CONSTANT_34
  #CONSTANT_35
  #CONSTANT_36
  #CONSTANT_37
  #CONSTANT_38
  #CONSTANT_39
  #CONSTANT_40
  #CONSTANT_41
  #CONSTANT_42
  #CONSTANT_43
  #CONSTANT_44
  #CONSTANT_45
  #CONSTANT_46
  #CONSTANT_47
  #CONSTANT_48
  #CONSTANT_49
  #CONSTANT_50
  #CONSTANT_51
  #CONSTANT_52
  #CONSTANT_53
  #CONSTANT_54
  #CONSTANT_55
  #CONSTANT_56
  #CONSTANT_57
  #CONSTANT_58
  #CONSTANT_59
  #CONSTANT_60
  #CONSTANT_61
  #CONSTANT_62
  #__CONSTANT_LAST__
EndEnumeration

If #__CONSTANT_LAST__ <= 0
  CallDebugger
EndIf

_________________
sorry for my bad english


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Sat May 09, 2020 12:13 am 
Offline
Addict
Addict
User avatar

Joined: Tue Dec 23, 2003 3:54 am
Posts: 1805
I like Josh's idea, in fact I'll go one step simpler :lol:
Code:
EnumerationBinary
  #Flag1
  #Flag2
  #Flag3
  #Flag4
  ;#Flag5 ; uncomment this to trigger error
 
  CompilerIf (#PB_Compiler_EnumerationValue > (1 << 4)) ; only allow 4 binary constants
    CompilerWarning "Too many binary constants!"
  CompilerEndIf
EndEnumeration


EDIT - Ah, I see the issue with negative overflow when going too far with this method...


+1 I like the feature request. Compiler Warning (not error) if >64 EnumerationBinary value.

I was going to say, maybe a warning of >32 when compiling 32-bit mode, but no, I think keep it consistent and 64-bits. Besides, you can use 64-bit quads in 32-bit compile mode.

_________________
On GitHub: PB Includes - IDE Tools - Color Themes - IDE Branches


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Sat May 09, 2020 12:19 am 
Offline
Enthusiast
Enthusiast
User avatar

Joined: Sun Jul 07, 2013 11:35 am
Posts: 511
Location: Canada
Josh wrote:
Why not use simple solutions like StarBootics...


Simple solution are always the best. That being said, I still recommend to have a compiler warning this shouldn't difficult to add since the compiler generate the constants. Fred is the boss so I will let him decide about this.

Best regards
StarBootics

_________________
The Stone Age did not end due to a shortage of stones !


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Sat May 09, 2020 2:07 am 
Offline
Enthusiast
Enthusiast

Joined: Thu Apr 18, 2019 8:17 am
Posts: 752
StarBootics wrote:
the compiler should raise a warning if the EnumerationBinary has more than 63 constants

+1


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Sun May 17, 2020 6:15 am 
Offline
Addict
Addict
User avatar

Joined: Thu Feb 09, 2006 11:27 pm
Posts: 2544
And what about another compiler tweak? Of course too late, would cause incompatibility issues :wink:
Do you see the different results of the following two snippets without giving it a try?

C O D E 1
Code:
EnumerationBinary
   #MessageLowPriority=   #Null
   #MessageHighPriority
   #MessageTopPriority
   #MessageDrawWindow
   #MessagePriorityFilter=   #MessageDrawWindow-1
EndEnumeration


C O D E 2
Code:
EnumerationBinary
   #MessageLowPriority=   #Null
   #MessageHighPriority=   1
   #MessageTopPriority
   #MessageDrawWindow
   #MessagePriorityFilter=   #MessageDrawWindow-1
EndEnumeration


Yes, it's not a typical one - especially the last line (which I kept to make it more difficult)...
...but I'd have liked code number one acting exactly as number two and three :mrgreen:

C O D E 3
Code:
#MessageLowPriority=   #Null
EnumerationBinary
   #MessageHighPriority
   #MessageTopPriority
   #MessageDrawWindow
   #MessagePriorityFilter=   #MessageDrawWindow-1
EndEnumeration


Top
 Profile  
Reply with quote  
 Post subject: Re: EnumerationBinary
PostPosted: Sun May 17, 2020 9:21 pm 
Offline
Addict
Addict
User avatar

Joined: Sat Feb 13, 2010 3:45 pm
Posts: 1074
All three codes give exactly the result I would have expected. 0*2 is 0 and remains 0, so what other result should come out? Each other result would be wrong.

I think you should use the PB stuff the way it is meant to be used and not try to find any bugs by any useless constructs. EnumerationBinary works perfect for what it is made for. The only thing that could made better by EnumerationBinary is that assignments that are not a power of 2 should not be allowed. Then such questions could not come up at all.

_________________
sorry for my bad english


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 11 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye