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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::imp::structs::qv::Qv;


#[repr(C)] #[derive(Debug, Clone, Copy)]
pub struct QvInt{
    val : i64,
    is_null : u32,
    is_undefined : u32,
}
impl QvInt{
    pub fn new(s : Qv<i64>)-> QvInt{
        match s{
            Qv::Val(i) => QvInt{ val : i, is_null : 0, is_undefined : 0 },
            Qv::Null => QvInt{ val : 0, is_null : 1, is_undefined : 0 },
            Qv::Undefined => QvInt{ val : 0, is_null : 0, is_undefined : 1 },
        }
    }
}
#[repr(C)] #[derive(Debug, Clone, Copy)]
pub struct OptInt{
    val : i64,
    is_valid : u32,
}
impl OptInt{
    pub fn new(val : i64, is_valid : u32) -> OptInt{ OptInt{ val, is_valid } }
    pub fn null_or(qv : Qv<i64>) -> OptInt{
        match qv{
            Qv::Val(i) => OptInt::new(i, 1),
            //一応奇妙で微妙な違いを出しておく
            Qv::Null => OptInt::new(0, 0),
            _ => OptInt::new(1, 0),
        }
    }
    pub fn undef_or(qv : Qv<i64>) -> OptInt{
        match qv{
            Qv::Val(i) => OptInt::new(i, 1),
            Qv::Undefined => OptInt::new(0,0),
            _ => OptInt::new(1, 0),
        }
    }
}

#[no_mangle] #[allow(non_snake_case)]
pub extern "C" fn QvInt_Value(p : QvInt) -> i64{
    p.val
}
#[no_mangle] #[allow(non_snake_case)]
pub extern "C" fn QvInt_IsNull(p : QvInt) -> i8{
    p.is_null as i8
}
#[no_mangle] #[allow(non_snake_case)]
pub extern "C" fn QvInt_IsUndefined(p : QvInt) -> i8{
    p.is_undefined as i8
}
#[no_mangle] #[allow(non_snake_case)]
pub extern "C" fn OptInt_Value(p : OptInt) -> i64{
    p.val
}
#[no_mangle] #[allow(non_snake_case)]
pub extern "C" fn OptInt_IsValid(p : OptInt) -> i8{
    p.is_valid as i8
}