~ubuntu-branches/ubuntu/utopic/slic3r/utopic

« back to all changes in this revision

Viewing changes to xs/src/perlglue.hpp

  • Committer: Package Import Robot
  • Author(s): Chow Loong Jin
  • Date: 2014-06-17 01:27:26 UTC
  • Revision ID: package-import@ubuntu.com-20140617012726-2wrs4zdo251nr4vg
Tags: upstream-1.1.4+dfsg
ImportĀ upstreamĀ versionĀ 1.1.4+dfsg

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef slic3r_perlglue_hpp_
 
2
#define slic3r_perlglue_hpp_
 
3
 
 
4
namespace Slic3r {
 
5
    
 
6
template<class T>
 
7
struct ClassTraits { 
 
8
    static const char* name;
 
9
    static const char* name_ref; 
 
10
};
 
11
 
 
12
// use this for typedefs for which the forward prototype
 
13
// in REGISTER_CLASS won't work
 
14
#define __REGISTER_CLASS(cname, perlname)                                            \
 
15
    template <>const char* ClassTraits<cname>::name = "Slic3r::" perlname;           \
 
16
    template <>const char* ClassTraits<cname>::name_ref = "Slic3r::" perlname "::Ref"; 
 
17
 
 
18
#define REGISTER_CLASS(cname,perlname)                                               \
 
19
    class cname;                                                                     \
 
20
    __REGISTER_CLASS(cname, perlname);
 
21
 
 
22
template<class T>
 
23
const char* perl_class_name(const T*) { return ClassTraits<T>::name; }
 
24
template<class T>
 
25
const char* perl_class_name_ref(const T*) { return ClassTraits<T>::name_ref; }
 
26
 
 
27
template<class T>
 
28
SV* perl_to_SV_ref(T &t) {
 
29
    SV* sv = newSV(0);
 
30
    sv_setref_pv( sv, perl_class_name_ref(&t), &t );
 
31
    return sv;
 
32
}
 
33
 
 
34
template<class T>
 
35
SV* perl_to_SV_clone_ref(const T &t) {
 
36
    SV* sv = newSV(0);
 
37
    sv_setref_pv( sv, perl_class_name(&t), new T(t) );
 
38
    return sv;
 
39
}
 
40
 
 
41
template <class T> 
 
42
class Ref {
 
43
    T* val;
 
44
public:
 
45
    Ref() {}
 
46
    Ref(T* t) : val(t) {}
 
47
    operator T*() const {return val; }
 
48
    static const char* CLASS() { return ClassTraits<T>::name_ref; }
 
49
};
 
50
  
 
51
template <class T>
 
52
class Clone {
 
53
    T* val;
 
54
public:
 
55
    Clone() : val() {}
 
56
    Clone(T* t) : val(new T(*t)) {}
 
57
    Clone(const T& t) : val(new T(t)) {}
 
58
    operator T*() const {return val; }
 
59
    static const char* CLASS() { return ClassTraits<T>::name; }
 
60
};
 
61
};
 
62
 
 
63
#endif