Skip to content

Commit d0c9003

Browse files
committed
Add mempy struct struct test
1 parent f560745 commit d0c9003

3 files changed

Lines changed: 203 additions & 0 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <assert.h>
2+
#include <stddef.h>
3+
#include <stdint.h>
4+
#include <string.h>
5+
6+
struct Entry {
7+
uint8_t bits;
8+
uint16_t value;
9+
};
10+
11+
int main(void) {
12+
struct Entry table[8] = {
13+
{1, 0x1111}, {2, 0x2222}, {3, 0x3333}, {4, 0x4444},
14+
{0, 0}, {0, 0}, {0, 0}, {0, 0},
15+
};
16+
size_t table_size = 4;
17+
18+
memcpy(&table[table_size], &table[0], table_size * sizeof(table[0]));
19+
20+
assert(table[4].bits == 1 && table[4].value == 0x1111);
21+
assert(table[5].bits == 2 && table[5].value == 0x2222);
22+
assert(table[6].bits == 3 && table[6].value == 0x3333);
23+
assert(table[7].bits == 4 && table[7].value == 0x4444);
24+
25+
return 0;
26+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
extern crate libcc2rs;
2+
use libcc2rs::*;
3+
use std::cell::RefCell;
4+
use std::collections::BTreeMap;
5+
use std::io::prelude::*;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::AsFd;
8+
use std::rc::{Rc, Weak};
9+
#[derive(Default)]
10+
pub struct Entry {
11+
pub bits: Value<u8>,
12+
pub value: Value<u16>,
13+
}
14+
impl Clone for Entry {
15+
fn clone(&self) -> Self {
16+
let mut this = Self {
17+
bits: Rc::new(RefCell::new((*self.bits.borrow()))),
18+
value: Rc::new(RefCell::new((*self.value.borrow()))),
19+
};
20+
this
21+
}
22+
}
23+
impl ByteRepr for Entry {}
24+
pub fn main() {
25+
std::process::exit(main_0());
26+
}
27+
fn main_0() -> i32 {
28+
let table: Value<Box<[Entry]>> = Rc::new(RefCell::new(Box::new([
29+
Entry {
30+
bits: Rc::new(RefCell::new(1_u8)),
31+
value: Rc::new(RefCell::new(4369_u16)),
32+
},
33+
Entry {
34+
bits: Rc::new(RefCell::new(2_u8)),
35+
value: Rc::new(RefCell::new(8738_u16)),
36+
},
37+
Entry {
38+
bits: Rc::new(RefCell::new(3_u8)),
39+
value: Rc::new(RefCell::new(13107_u16)),
40+
},
41+
Entry {
42+
bits: Rc::new(RefCell::new(4_u8)),
43+
value: Rc::new(RefCell::new(17476_u16)),
44+
},
45+
Entry {
46+
bits: Rc::new(RefCell::new(0_u8)),
47+
value: Rc::new(RefCell::new(0_u16)),
48+
},
49+
Entry {
50+
bits: Rc::new(RefCell::new(0_u8)),
51+
value: Rc::new(RefCell::new(0_u16)),
52+
},
53+
Entry {
54+
bits: Rc::new(RefCell::new(0_u8)),
55+
value: Rc::new(RefCell::new(0_u16)),
56+
},
57+
Entry {
58+
bits: Rc::new(RefCell::new(0_u8)),
59+
value: Rc::new(RefCell::new(0_u16)),
60+
},
61+
])));
62+
let table_size: Value<u64> = Rc::new(RefCell::new(4_u64));
63+
{
64+
(((table.as_pointer() as Ptr<Entry>).offset((*table_size.borrow()) as isize))
65+
as Ptr<Entry>)
66+
.to_any()
67+
.memcpy(
68+
&(((table.as_pointer() as Ptr<Entry>).offset(0 as isize)) as Ptr<Entry>).to_any(),
69+
(*table_size.borrow()).wrapping_mul(::std::mem::size_of::<Entry>() as u64 as u64)
70+
as usize,
71+
);
72+
(((table.as_pointer() as Ptr<Entry>).offset((*table_size.borrow()) as isize)) as Ptr<Entry>)
73+
.to_any()
74+
.clone()
75+
};
76+
assert!(
77+
(((*(*table.borrow())[(4) as usize].bits.borrow()) as i32) == 1)
78+
&& (((*(*table.borrow())[(4) as usize].value.borrow()) as i32) == 4369)
79+
);
80+
assert!(
81+
(((*(*table.borrow())[(5) as usize].bits.borrow()) as i32) == 2)
82+
&& (((*(*table.borrow())[(5) as usize].value.borrow()) as i32) == 8738)
83+
);
84+
assert!(
85+
(((*(*table.borrow())[(6) as usize].bits.borrow()) as i32) == 3)
86+
&& (((*(*table.borrow())[(6) as usize].value.borrow()) as i32) == 13107)
87+
);
88+
assert!(
89+
(((*(*table.borrow())[(7) as usize].bits.borrow()) as i32) == 4)
90+
&& (((*(*table.borrow())[(7) as usize].value.borrow()) as i32) == 17476)
91+
);
92+
return 0;
93+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
extern crate libc;
2+
use libc::*;
3+
extern crate libcc2rs;
4+
use libcc2rs::*;
5+
use std::collections::BTreeMap;
6+
use std::io::{Read, Seek, Write};
7+
use std::os::fd::{AsFd, FromRawFd, IntoRawFd};
8+
use std::rc::Rc;
9+
#[repr(C)]
10+
#[derive(Copy, Clone, Default)]
11+
pub struct Entry {
12+
pub bits: u8,
13+
pub value: u16,
14+
}
15+
pub fn main() {
16+
unsafe {
17+
std::process::exit(main_0() as i32);
18+
}
19+
}
20+
unsafe fn main_0() -> i32 {
21+
let mut table: [Entry; 8] = [
22+
Entry {
23+
bits: 1_u8,
24+
value: 4369_u16,
25+
},
26+
Entry {
27+
bits: 2_u8,
28+
value: 8738_u16,
29+
},
30+
Entry {
31+
bits: 3_u8,
32+
value: 13107_u16,
33+
},
34+
Entry {
35+
bits: 4_u8,
36+
value: 17476_u16,
37+
},
38+
Entry {
39+
bits: 0_u8,
40+
value: 0_u16,
41+
},
42+
Entry {
43+
bits: 0_u8,
44+
value: 0_u16,
45+
},
46+
Entry {
47+
bits: 0_u8,
48+
value: 0_u16,
49+
},
50+
Entry {
51+
bits: 0_u8,
52+
value: 0_u16,
53+
},
54+
];
55+
let mut table_size: u64 = 4_u64;
56+
{
57+
if (table_size).wrapping_mul(::std::mem::size_of::<Entry>() as u64 as u64) != 0 {
58+
::std::ptr::copy_nonoverlapping(
59+
((&mut table[(0) as usize] as *mut Entry) as *const Entry as *const ::libc::c_void),
60+
((&mut table[(table_size) as usize] as *mut Entry) as *mut Entry
61+
as *mut ::libc::c_void),
62+
(table_size).wrapping_mul(::std::mem::size_of::<Entry>() as u64 as u64) as usize,
63+
)
64+
}
65+
((&mut table[(table_size) as usize] as *mut Entry) as *mut Entry as *mut ::libc::c_void)
66+
};
67+
assert!(
68+
((table[(4) as usize].bits as i32) == (1))
69+
&& ((table[(4) as usize].value as i32) == (4369))
70+
);
71+
assert!(
72+
((table[(5) as usize].bits as i32) == (2))
73+
&& ((table[(5) as usize].value as i32) == (8738))
74+
);
75+
assert!(
76+
((table[(6) as usize].bits as i32) == (3))
77+
&& ((table[(6) as usize].value as i32) == (13107))
78+
);
79+
assert!(
80+
((table[(7) as usize].bits as i32) == (4))
81+
&& ((table[(7) as usize].value as i32) == (17476))
82+
);
83+
return 0;
84+
}

0 commit comments

Comments
 (0)