-
Notifications
You must be signed in to change notification settings - Fork 1
/
cppFriendsExt.cpp
113 lines (92 loc) · 2.9 KB
/
cppFriendsExt.cpp
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <cstring>
#include "cppFriends.hpp"
// インライン展開されると結果が変わる関数をここに書く
void Shift35ForInt32Asm(int32_t& result, int32_t src) {
int32_t count = CPPFRIENDS_SHIFT_COUNT;
asm volatile (
"movl %1, %0 \n\t"
"movl %2, %%ecx \n\t"
"shl %%cl, %0 \n\t"
:"=r"(result):"r"(src),"r"(count):"%ecx","memory");
// 第一引数はRCXレジスタに入っているので、破壊レジスタに指定しないとクラッシュする
// :"=r"(result):"r"(src),"r"(count):);
}
int32_t Shift35ForInt32(int32_t src) {
decltype(src) result = src;
// シフト回数が多すぎる警告を出さないようにする
#if CPPFRIENDS_SHIFT_COUNT >= 32
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshift-count-overflow"
#endif
result <<= CPPFRIENDS_SHIFT_COUNT;
// 以後は、シフト回数が多すぎる警告を出す
#if CPPFRIENDS_SHIFT_COUNT >= 32
#pragma GCC diagnostic pop
#endif
return result;
}
int32_t ShiftForInt32(int32_t src, int32_t count) {
decltype(src) result = src;
result <<= count;
return result;
}
// 宣言と定義の型が違ったら困る例
// うろ覚えの情報で、int*だと思ってアクセスされると、
// 0xf0000000 または 0xe0000000f0000000を指すポインタとして読まれてしまう
unsigned int g_pointerOrArray[] = {0xf0000000u, 0xe0000000u};
// 他の.cppから参照される
const int g_externIntValue = 1;
// クラスにこのようなことをすると、vtableへのポインタもクリアしてしまう
void SubDynamicObjectMemFunc::Clear(void) {
memset(this, 0, sizeof(*this));
}
void SubDynamicObjectMemFunc::Print(std::ostream& os) {
os << memberA_ << memberB_;
}
void ExtraMemFunc::Print(std::ostream& os) {
os << "Extra";
}
MyStringList::MyStringList(size_t n) {
for(decltype(n) i=0; i<n; ++i) {
dataSet_.push_back("12345678901234567890123456789012345678901234567890123456789012345");
}
}
void MyStringList::Print(std::ostream& os) const {
for(auto& s : dataSet_) {
os << s;
}
}
void MyStringList::Pop(void) {
dataSet_.pop_front();
}
void MyStringList::Clear(void) {
dataSet_.clear();
}
namespace {
const int ConstantIntSample = 12;
}
const uint8_t ConstantArraySample[ConstantArraySampleSize] {0};
const int& ConstantIntRefSample = ConstantIntSample;
IntHolderImplicit::IntHolderImplicit(int arg) : value_(arg) {
return;
}
IntHolderImplicit::operator int&() {
return value_;
}
IntHolderImplicit::operator int() const {
return value_;
}
IntHolderExplicit::IntHolderExplicit(int arg) : value_(arg) {
return;
}
int IntHolderExplicit::Get() const {
return value_;
}
/*
Local Variables:
mode: c++
coding: utf-8-dos
tab-width: nil
c-file-style: "stroustrup"
End:
*/