File: ArgumentSizeCalculator.h

package info (click to toggle)
aspectc%2B%2B 1.0pre4~svn.20090918-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 117,308 kB
  • ctags: 410,601
  • sloc: cpp: 1,883,007; ansic: 17,279; sh: 2,190; makefile: 1,088
file content (41 lines) | stat: -rw-r--r-- 948 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef ARGUMENTSIZECALCULATOR_H
#define ARGUMENTSIZECALCULATOR_H

/*
 * Template Metaprogram to calculate the size of the arguments
 * of a given JoinPoint on the stack
 * 
 * uses the JoinPoint API
 */

template <typename T>
struct TypedSizeCalculator {
    enum { RESULT = sizeof(T) };
};

template <typename T>
struct TypedSizeCalculator<T&> {
    enum  { RESULT = sizeof(T*) };
};

template <typename T> 
class ArgumentSizeCalculator {
 // Workaround for http://aspectc.org/bugzilla/show_bug.cgi?id=236
#ifndef __puma
      private:
      template <typename TJP, int i> struct Sum_N {
        enum { RESULT = TypedSizeCalculator<typename TJP::template Arg<i-1>::Type>::RESULT + Sum_N<TJP, i-1>::RESULT };
      };
            
      template <typename TJP> struct Sum_N <TJP, 0> {
        enum { RESULT = 0};
      };
   
      public:
        enum { RES = Sum_N<T, T::ARGS>::RESULT };
#else 
     enum { RES = 42 };
#endif        
};

#endif