Deutsch   English   Français   Italiano  
<vapmvd$3ullf$5@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Thiago Adams <thiago.adams@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: enum sets
Date: Thu, 29 Aug 2024 08:44:45 -0300
Organization: A noiseless patient Spider
Lines: 125
Message-ID: <vapmvd$3ullf$5@dont-email.me>
References: <vaoclb$3lfbf$1@dont-email.me> <vap88m$3ssqh$1@dont-email.me>
 <vapmcd$3ullf$2@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 29 Aug 2024 13:44:45 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="f80b8b85f3cf443035f3bd640f6489b4";
	logging-data="4150959"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18+LpYMPUJWQgkJBrW9eVGKJVh7ixlfL/k="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:G7pjCp6Vh620XImP+VzKAxwrkxg=
Content-Language: en-US
In-Reply-To: <vapmcd$3ullf$2@dont-email.me>
Bytes: 3806

On 29/08/2024 08:34, Thiago Adams wrote:
> On 29/08/2024 04:33, David Brown wrote:
>> On 29/08/2024 01:42, Thiago Adams wrote:
>>> I am wondering how useful would be to have enum sets.
>>>
>>> Let´s say you have a function that accepts only monospaced fonts.Then 
>>> you can use enum monospaced_font_type. Or a switch case where you 
>>> need to check all and only monospaced_font_type.
>>>
>>> But at same type you can store at same object monospaced_font_type or 
>>> font_type.
>>>
>>> enum font_type
>>> {
>>>      enum monospaced_font_type
>>>      {
>>>          CASCADIA_FONT,
>>>      },
>>>      ARIAL_FONT
>>> };
>>>
>>> This could be arranged in any way.
>>>
>>
>> I think this could have some use-cases, but I suspect that often you 
>> would want to have separate enumerations defined first, then combine 
>> them with a sum type (aka variant, tagged union, discriminated type, 
>> etc.).
>>
>>
>> enum monospaced_font_type {
>>      cascadia
>> };
>>
>> enum proportional_font_type {
>>      arial
>> };
>>
>> typedef struct {
>>      enum { is_monospaced_font_type, is_proportional_font_type } tag;
>>      union {
>>          enum monospaced_font_type mf;
>>          enum proportional_font_type pf;
>>      }
>> } font_type;
>>
> 
> One of my motivations was that I have a big enum and sometimes I need to 
> check in switch cases all values of some type.
> 
> For instance, let's say
> 
> enum E {A, B, C, D /*until Z*/};
> 
> And I need to check a subset  for instance  A, B
> 
> To have a warning if I miss some item I need to include all cases.
> 
> void f(enum E e)
> {
>     switch(e)
>     {
>       case A:
>       case B:
>       break;
> 
>       case C:
>       //..Z
>       break;
>     }
> }
> //warning you missing D case.
> 
> 
> The  problem this is not practical when  the number of items is too big.
> Using default:break; makes it practical but then the warning disappears.
> 
> 
> With this enum set idea the code would be
> 
> enum E {
>     enum Subset {A, B}
>     ,
>     C,
>     D /*until Z*/
> };
> 
> void f(enum Subset e)
> {
>     switch(e)
>     {
>       case A:
>       break;
>     } //warning you miss case  B
> }
> 
> 

Another motivation could be error code sets.

But I think this may not be practical. (So this was not my motivation)

enum error {
   enum  func1_error {
      E1, E2
   }
   enum  func2_error {
      E1, E3
   }
}


enum func2_error func2();

enum func2_error error = func2();
switch (error) {
    case E1:
    case E3:
    break;
}