- 1
- 2
- 3
- 4
- 5
- 6
try {
IntToStr(pageid);
}
catch (...) {
pageid = 0;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+76
try {
IntToStr(pageid);
}
catch (...) {
pageid = 0;
}
А вдруг?
+10
align.h:
#pragma once
#include "stdint.h"
namespace tblib
{
template <typename T>
struct check_align
{
uint8_t c;
T t;
check_align();
check_align(const check_align&);
check_align&operator=(const check_align&);
};
template <typename T>
struct align_value
{
enum { value = sizeof(check_align<T>)-sizeof(T) };
};
template <int N>
struct align_by_size;
template <>
struct align_by_size<1> { uint8_t guts; };
template <>
struct align_by_size<2> { uint16_t guts; };
template <>
struct align_by_size<4> { uint32_t guts; };
template <>
struct align_by_size<8> { uint64_t guts; };
template <typename T>
struct align
{
align_by_size<align_value<T>::value> guts;
};
};
класс массива (начало), файл tbarr.h:
#pragma once
#include "stdint.h"
#include "assert.h"
#include <algorithm>
#include "tbslice.h"
#include "align.h"
// FUCK THE EXCEPTIONS
template <typename T>
void construct (T* first, T* last) {
while (first!=last) {
new(first) T;
++first;
}
}
template <typename T>
void destroy (T* first, T* last) {
while (last!=first) {
--last;
last->~T();
}
}
namespace tblib
{
template <typename T, int N>
class base_array
{
union
{
uint8_t memory [sizeof(T[N])];
align<T> aligner;
};
public :
мой выравниватель
намного красивее бустовского, не так ли?
+1
struct Vector2f{float x, y;};
struct Vector3f{float x, y, z;};
struct Tensor3f{float xx, xy, xz, yy, yz, zz;};
struct Matrix3x3f{float data[9];};
struct Space2
{
typedef Vector2f Vector;
};
struct Space3
{
typedef Vector3f Vector;
};
template<typename Space>
struct ParticleSystem
{
template<typename T>
struct ParticleData{};
template<>
struct ParticleData<Space2>
{
float orientation;
float invInertia;
};
template<>
struct ParticleData<Space3>
{
typename Matrix3x3f orientation;
typename Tensor3f inertiaTensor;
};
struct Particle : public ParticleData<Space>
{
typename Space::Vector pos, velocity;
};
template<typename T>
void DumpParticle(){}
template<>
void DumpParticle<Space2>()
{
printf("%f %f", particles[0].orientation, particles[0].invInertia);
}
template<>
void DumpParticle<Space3>()
{
printf("%f %f", particles[0].orientation.data[0], particles[0].inertia.xx);
}
void DumpParticles()
{
DumpParticle<Space>();
}
std::vector<Particle> particles;
};
Хочу объединить трехмерный и двухмерный движок.
+4
#include <iostream>
using namespace std;
void enable_misalignment_access_check(){
cout<<"begin "<<__FUNCTION__<<endl;
__asm__(
"pushf\n"
"orl $(1<<18),(%esp)\n"
"popf\n"
);
cout<<"end "<<__FUNCTION__<<endl;
}
void alignedAccess(volatile unsigned char foo[])
{
cout<<"begin "<<__FUNCTION__<<endl;
volatile int t = *(int *)(foo);
cout<<"end "<<__FUNCTION__<<endl;
}
void unalignedAccess(volatile unsigned char foo[])
{
cout<<"begin "<<__FUNCTION__<<endl;
volatile int t = *(int *)(foo+1);
cout<<"end "<<__FUNCTION__<<endl;
}
unsigned char foo[] = { 1, 2, 3, 4, 5, 6 };
int main(void)
{
alignedAccess(foo);
unalignedAccess(foo);
enable_misalignment_access_check();
alignedAccess(foo);
unalignedAccess(foo);
return 0;
}
http://codepad.org/D6b5asES
begin alignedAccess end alignedAccess
begin unalignedAccess end unalignedAccess
begin enable_misalignment_access_check end enable_misalignment_access_check
begin alignedAccess end alignedAccess
begin unalignedAccess
Bus error
+19
template<class T>
class smartest_ptr
{
std::unique_ptr<T> m_p;
std::array<char, sizeof(T)> m_data; // массив размером с объект
public:
void New() {m_p = new(&m_data) T();}
operator ->() {return m_p;}
};
// никакого выделения памяти из кучи!
smartest_ptr<CFoo> pFoo; // типа nullptr
// pFoo->Method(); - нельзя, nullptr
pFoo.New();
pFoo->FooMethod();
pFoo->AnotherMeth();
-- Чип и ДейлКрестовики спешат на помощь тем у кого медленная куча.
-- Откуда спешат?
-- Оттуда.
+11
#define EDGE_EDGE_TEST(V0,U0,U1) \
Bx=U0[i0]-U1[i0]; \
By=U0[i1]-U1[i1]; \
Cx=V0[i0]-U0[i0]; \
Cy=V0[i1]-U0[i1]; \
f=Ay*Bx-Ax*By; \
d=By*Cx-Bx*Cy; \
if((f>0 && d>=0 && d<=f) || (f<0 && d<=0 && d>=f)) \
{ \
e=Ax*Cy-Ay*Cx; \
if(f>0) \
{ \
if(e>=0 && e<=f) return 1; \
} \
else \
{ \
if(e<=0 && e>=f) return 1; \
} \
}
#define POINT_IN_TRI(V0,U0,U1,U2) \
{ \
double a,b,c,d0,d1,d2; \
/* is T1 completly inside T2? */ \
/* check if V0 is inside tri(U0,U1,U2) */ \
a=U1[i1]-U0[i1]; \
b=-(U1[i0]-U0[i0]); \
c=-a*U0[i0]-b*U0[i1]; \
d0=a*V0[i0]+b*V0[i1]+c; \
\
a=U2[i1]-U1[i1]; \
b=-(U2[i0]-U1[i0]); \
c=-a*U1[i0]-b*U1[i1]; \
d1=a*V0[i0]+b*V0[i1]+c; \
\
a=U0[i1]-U2[i1]; \
b=-(U0[i0]-U2[i0]); \
c=-a*U2[i0]-b*U2[i1]; \
d2=a*V0[i0]+b*V0[i1]+c; \
if(d0*d1>0.0) \
{ \
if(d0*d2>0.0) return 1; \
} \
}
#define NEWCOMPUTE_INTERVALS(VV0,VV1,VV2,D0,D1,D2,D0D1,D0D2,A,B,C,X0,X1) \
{ \
if(D0D1>0.0f) \
{ \
/* here we know that D0D2<=0.0 */ \
/* that is D0, D1 are on the same side, D2 on the other or on the plane */ \
A=VV2; B=(VV0-VV2)*D2; C=(VV1-VV2)*D2; X0=D2-D0; X1=D2-D1; \
} \
else if(D0D2>0.0f)\
{ \
/* here we know that d0d1<=0.0 */ \
A=VV1; B=(VV0-VV1)*D1; C=(VV2-VV1)*D1; X0=D1-D0; X1=D1-D2; \
} \
else if(D1*D2>0.0f || D0!=0.0f) \
{ \
/* here we know that d0d1<=0.0 or that D0!=0.0 */ \
A=VV0; B=(VV1-VV0)*D0; C=(VV2-VV0)*D0; X0=D0-D1; X1=D0-D2; \
} \
else if(D1!=0.0f) \
{ \
A=VV1; B=(VV0-VV1)*D1; C=(VV2-VV1)*D1; X0=D1-D0; X1=D1-D2; \
} \
else if(D2!=0.0f) \
{ \
A=VV2; B=(VV0-VV2)*D2; C=(VV1-VV2)*D2; X0=D2-D0; X1=D2-D1; \
} \
else \
{ \
/* triangles are coplanar */ \
return coplanar_tri_tri(N1,V0,V1,V2,U0,U1,U2); \
} \
}
Макросы макросики. Inline? Нет, не слышал.
+9
#include <iostream>
#include <iterator>
#include <algorithm>
#include <array>
#include <memory>
using namespace std;
template<size_t N1, size_t N2, class T1, class T2,
class T = typename common_type<T1, T2>::type>
T (*concatCArray(const T1(&arr1)[N1], const T2(&arr2)[N2]))[N1+N2]{
const auto result = (T(*)[N1+N2]) new T[N1+N2];
copy(arr2, end(arr2), copy(arr1, end(arr1), *result));
return result;
}
template<std::size_t N, class T>
void viewCArrayPtr(T (*arr)[N]){
copy(*arr, end(*arr), ostream_iterator<T>(cout, " "));
}
template<size_t N1, size_t N2, class T1, class T2,
class T = typename remove_const<typename common_type<T1, T2>::type>::type>
array<T, N1+N2> concatArray(const array<T1, N1> &arr1, const array<T2, N2> &arr2){
array<T, N1+N2> result;
copy(begin(arr2), end(arr2), copy(begin(arr1), end(arr1), result.begin()));
return result;
}
template<std::size_t N, class T>
void viewArray(const array<T, N> arr){
copy(begin(arr), end(arr), ostream_iterator<T>(cout, " "));
}
int main() {
int arr1[]{0,1,2,3}, arr2[]{4,5,6};
auto ca = concatCArray(arr1, arr2);
unique_ptr<int[]> safe(*ca);
viewCArrayPtr(ca);
cout<<endl;
array<float, 2> a {1,2.5};
array<int, 3> b{3, 4, 5};
viewArray(concatArray(a, b));
return 0;
}
От туда.
http://ideone.com/3KjycI
+4
namespace std
{
template<class T, class T2> class common_type<::std::shared_ptr<T>, ::std::shared_ptr<T2> >: public ::std::common_type<T, T2>{};
+3
class Base
{
void fooo() { ... }
};
class Derived
{
void fooo() { ... }
};
void DoSmth (Base& b)
{
b.fooo();
};
Derived d;
DoSmth(d); // полная статика, так что там внутри вызовется метод базы
void DoSmth (polymorth<Base>& b) // это структура, которая хранит ссылку на объект и ссылку на таблицу методов
{
b.fooo();
};
polymorth<Base>b = Derived();
// инициализация при объявлении, чтобы было понятно, сколько памяти выделить
// в структуре записалась таблица методов Derived
DoSmth(b); // вызовется метод наследника
...
// в конце вызывается деструктор наследника
Творчество оттуда.
"Основная идея - избавить от вопроса "делать ли деструктор виртуальным"
+10
typedef boost::shared_ptr<LPDIRECT3D9> Direct3dShared;
Те кто знают, что такое в гейдеве LPDIRECT3D9 и IDirect3D9 - поймут.
Думаю сегодня даже не нужно писать с какого это сайта.