- 1
- 2
- 3
- 4
template<typename T>
constexpr size_t printed_sizeof() {
return log10(sizeof(T)) + 1;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+14
template<typename T>
constexpr size_t printed_sizeof() {
return log10(sizeof(T)) + 1;
}
Осваиваем новые стандарты.
+20
#define STR(a) #a
#define EXCEPTION_CLASS_CREATE(a) \
class a : public std::exception \
{ \
public: \
a() \
{ \
d(STR(a)"\n"); \
} \
\
a(const char * format, ...) \
{ \
char buffer[ 1024 ]; \
va_list vl; \
va_start( vl, format ); \
vsnprintf( buffer, sizeof(buffer), format, vl ); \
va_end( vl ); \
_str.append( buffer ); \
d(STR(a)" %s\n", buffer); \
} \
\
~a() throw() \
{ \
} \
\
const char* what() const throw() \
{ \
return _str.c_str(); \
} \
private: \
std::string _str; \
};
// ...
EXCEPTION_CLASS_CREATE( InternalException )
Мы очень любим varargs
+13
class session {
public:
session(int id, boost::asio::io_service &io_service) :
id(id),
timer(io_service)
{
timer.expires_from_now(session_timeout);
timer.async_wait(boost::bind(&session::on_timeout, this, _1));
}
void on_timeout(const boost::system::error_code &error) {
if (error)
return;
std::cout << "Session timed out " << id << std::endl;
}
private:
int id;
boost::asio::deadline_timer timer;
};
std::map<boost::asio::ip::udp::endpoint, boost::shared_pointer<session> > sessions;
sessions.erase(endpoint) приводит к небольшому насилию над трупом сессии... Ничего конечно не вылетает, и никогда не сломается, но совесть мучает, неприятно пользоваться UB'ом.
+15
String testName;
//...
std::swap(testName, _testName);
String из thirdparty-библиотеки, а swap везде в нашем коде. По очевидным причинам получаем подение производительности.
+23
struct mystream: public std::ostream
{
mystream(std::ostream & o): std::ostream(o.rdbuf()) {}
template <class T>
mystream & operator << (T const & arg)
{
if (enabled_) as_std_ostream() << arg;
return *this;
}
// дерьмо STX
mystream & operator << (std::ostream & (*f)(std::ostream &))
{
if (enabled_) as_std_ostream() << f;
return *this;
}
mystream & operator << (std::ios & (*f)(std::ios &))
{
if (enabled_) as_std_ostream() << f;
return *this;
}
mystream & operator << (std::ios_base & (*f)(std::ios_base &))
{
if (enabled_) as_std_ostream() << f;
return *this;
}
// дерьмо ETX
void enable() { enabled_ = true; }
void disable() { enabled_ = false; }
protected:
bool enabled_;
std::ostream & as_std_ostream() { return *this; }
};
а так хотелось хоть сегодня рыбки поесть захерачить вместо трёх перегрузок
template <class O>
mystream & operator << (O & (*f)(O &)) { ...
+28
class atoi_func
{
public:
atoi_func(): value_() {}
inline int value() const { return value_; }
inline bool operator() (const char *str, size_t len)
{
value_ = 0;
int sign = 1;
if (str[0] == '-') { // handle negative
sign = -1;
++str;
--len;
}
switch (len) { // handle up to 10 digits, assume we're 32-bit
case 10: value_ += (str[len-10] - '0') * 1000000000;
case 9: value_ += (str[len- 9] - '0') * 100000000;
case 8: value_ += (str[len- 8] - '0') * 10000000;
case 7: value_ += (str[len- 7] - '0') * 1000000;
case 6: value_ += (str[len- 6] - '0') * 100000;
case 5: value_ += (str[len- 5] - '0') * 10000;
case 4: value_ += (str[len- 4] - '0') * 1000;
case 3: value_ += (str[len- 3] - '0') * 100;
case 2: value_ += (str[len- 2] - '0') * 10;
case 1: value_ += (str[len- 1] - '0');
value_ *= sign;
return value_ > 0;
default:
return false;
}
}
private:
int value_;
};
standard atoi()
79142 milliseconds
class atoi_func
131 milliseconds.
Если приходится велосипедить стандартные функции, то это камень в огород С++. Видать кресты писали гении ассемблерной оптимизации.
+14
void ThumbnailAdapter::clearCache(size_t index) {
if ((size_t)-1 == index) {
mImages.clear();
} else {
ImagesMap::iterator it = mImages.find (index);
if (mImages.end() != it) {
mImages.erase(it);
}
}
}
годная очистка map'ы
+16
class Context;
class AbstractState
{
Context * m_context;
protected:
Context * context() const { return m_context; }
public:
AbstractState(Context * context) : m_context(context) { };
virtual ~AbstractState() { }
virtual void doSomething() = 0;
};
class Context
{
std::unique_ptr<AbstractState> m_state;
public:
enum State
{
State1,
State2,
};
Context() { switchToState(State1); }
void switchToState(State newState);
void doSomething() { m_state->doSomething(); }
void someCleanup() { }
};
class ConcreteState1 : public AbstractState
{
public:
ConcreteState1(Context * context) : AbstractState(context) { }
virtual void doSomething()
{
context()->switchToState(Context::State2);
context()->someCleanup();
}
};
class ConcreteState2 : public AbstractState
{
public:
ConcreteState2(Context * context) : AbstractState(context) { }
virtual void doSomething()
{
context()->switchToState(Context::State1);
context()->someCleanup();
}
};
void Context::switchToState(State newState)
{
switch(newState)
{
case State1:
m_state.reset(new ConcreteState1(this));
return;
case State2:
m_state.reset(new ConcreteState2(this));
return;
}
}
Бывает, на меня находит состояние "сначала делай, потом думай", благо результат был быстро обнаружен отладчиком.
+14
struct base {
template <class Foo>
base() {}
};
struct derived {
derived()
: base::base<int>() // why not?? WHHYYYY?
{}
};
base b1 = base::base<int>();
base b2<int>();
долбанный комитет
им проще запретить, чем продумать нормальный способ вызова шаблонного конструктора
+12
http://pastebin.com/kG05YmBX
Поиск подстроки в строке, написано однокурсником