- 
                Notifications
    You must be signed in to change notification settings 
- Fork 196
Modularized bitsets #1049
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Modularized bitsets #1049
Conversation
| I would have say to better rely on C-preprocessing and passing a flag definition  | 
| 
 I agree, but I could not find a backward-compatible approach with C-preprocessing. However, with cpp, something like  Any other suggestions? | 
| Here is an idea: #ifdef STDLIB_WITH_BITSET
#define WITH_BITSET 1
#else
#define WITH_BITSET 0
#endifThis file can be included elsewhere with  | 
| 
 Thank you. I tried with this strategy, but then I was challenged with the      #:for k1, t1 in IRB_KIND_TYPES
      module procedure :: swap_${k1}$
   #:endforWith  An ugly (at least for me) solution could be:     #:for k1, t1 in IRB_KIND_TYPES
    #:if 'bitset' in t1
#ifdef WITH_BITSET
    #:endif
      module procedure :: swap_${k1}$
    #:if 'bitset' in t1
#end
    #:endif
   #:endforI have the feeling that such an approach will result in a code even more difficult to follow and maintain. All suggestions are welcome. | 
| I tried to give it some more thoughts but indeed I can't think of a more elegant way of handling this. Your solution is very good, just wanted to check if we could rely on c-preprocessing which is much more standard. In any case, I would say, given that both GNU and Intel compilers can handle all the features and are the most common compilers, to keep it activated by default and let users remove it with fypp for other compilers which can't compile these modules. I would like to keep the idea of a macro header file open for future ideas though, I think it might facilitate many future hurdles. | 
| 
 Too bad! I would also prefer a c-preprocessing approach. 
 I agree. At least it will provide some flexibility to the users. 
 Definitively! | 
| One solution to combine fypp and cpp preprocessing for this module and keep it "readable" would be : 
 module stdlib_math
    use stdlib_kinds, only: int8, int16, int32, int64, sp, dp, xdp, qp
    use stdlib_optval, only: optval
#if WITH_BITSETS
    use stdlib_bitsets, only: bitset_64, bitset_large
#endif
    implicit none
    private
...
    interface swap
    #:for k1, t1 in IR_KINDS_TYPES
    module procedure :: swap_${k1}$
    #:endfor
#if WITH_BITSETS
    #:for k1, t1 in BITSET_KINDS_TYPES
    module procedure :: swap_${k1}$
    #:endfor
#endif
    ...
    end interface
 In this manner: fypp will preprocess everything as usual. And the macro would be a build-time flag. It is not much different from what we already discussed, just by not combining the  | 
| 
 I am afraid that this approach will consist in duplicating codes. For example, the code for the implementation of  | 
| Yes, that's right. | 
| Maybe another idea: would it be possible to add a      interface swap
    #:for k1, t1 in IR_KINDS_TYPES+BITSET_KINDS_TYPES
    #:generate_cpp_ir(BITSET_KINDS_TYPES)
    module procedure :: swap_${k1}$
    #:endfor
    ...
    end interfaceresulting in:     interface swap
    module procedure :: swap_int8
    module procedure :: swap_int32
....
    module procedure :: swap_real32
    module procedure :: swap_real64
....
#if WITH_BITSETS
    module procedure :: swap_bitsets32
    module procedure :: swap_bitsets64
#endif
    ...
    end interface | 
| Looking at the documentation entry https://fypp.readthedocs.io/en/stable/fypp.html#features at "Passing (unquoted) multiline string arguments to callables" ... Something like: #:def CPP_MACRO(code, type, list)
    #:if type in list
#ifdef WITH_BITSET
    #:endif
    $:code
    #:if type in list
#endif
    #:endif
#:enddef CPP_MACRO
...
interface swap
      #:for k1, t1 in INT_KINDS_TYPES + REAL_KINDS_TYPES + BITSET_KINDS_TYPES
      #:block CPP_MACRO(type = t1, list=BITSET_TYPES)
      module procedure :: swap_${k1}$
      #:endblock CPP_MACRO
      #:endforwould generate:     interface swap
      module procedure :: swap_int8
      module procedure :: swap_int16
      module procedure :: swap_int32
      module procedure :: swap_int64
      module procedure :: swap_sp
      module procedure :: swap_dp
#ifdef WITH_BITSET
      module procedure :: swap_bitset_64
#endif
#ifdef WITH_BITSET
      module procedure :: swap_bitset_large
#endifI tried putting the loop within the  | 
| 
 Great. I will try with this approach | 
Based on #1031, #1033
Here is a proposition to modularize
stdlib_bitsetsincmake.Furthermore, compiling
stdlib_bitsetscan be now set off withcmake\cc: @eduardz1 @jalvesz @perazz