Size: a a a

2020 July 22

AS

Anatoly Shirokov in supapro.cxx
.
Я не видел этого, так как зашёл в эту беседу сегодня
Мы вчера обсуждали через reserve, это минимизирует аллокации
источник

s

std::slavik in supapro.cxx
щас типа такого переписал
источник

.

. in supapro.cxx
vexillum
а откуда задача?
Задачи нет, просто самому нужна была реализация для удобной конкатенации
источник

Т8

Т-34 85 in supapro.cxx
.
Я не видел этого, так как зашёл в эту беседу сегодня
погоди-погоди. Ты вчера задал вопрос, на него люди отвечали, а ты не стал ничего читать, задал ещё раз вопрос, я правильно понял?
источник

v

vexillum in supapro.cxx
.
Задачи нет, просто самому нужна была реализация для удобной конкатенации
просто прикольно, что за два дня два человека с очень похожими задачами общались
источник

.

. in supapro.cxx
Т-34 85
погоди-погоди. Ты вчера задал вопрос, на него люди отвечали, а ты не стал ничего читать, задал ещё раз вопрос, я правильно понял?
Меня вчера тут не было
источник

.

. in supapro.cxx
Максимум, что я спрашивал это про указатели и char*
источник

IZ

Ilia Zviagin in supapro.cxx
.
Ну да, я вообще написал отдельную функцию, которая принимает две строки, выделяет под всю длину + 1 новую строку и склеивает их через wcscat
Ой плохо...
источник

D

Danya in supapro.cxx
std::slavik
class SerialLogger : public ILogging, public Singleton<SerialLogger> {
public:
 typedef std::ostream &(*ManipFn)(std::ostream &);
 typedef std::ios_base &(*FlagsFn)(std::ios_base &);

 SerialLogger();
 template <class T>  &operator<<(const T &output) {
   lock();
   _stream_buf << output;
   unlock();

   return *this;
 }

 SerialLogger &operator<<(ManipFn manip){
   lock();

   manip(_stream_buf);

   if (manip == static_cast<ManipFn>(std::flush) ||
       manip == static_cast<ManipFn>(std::endl)) {
     this->flush();
   }
   unlock();

   return *this;
 }

 SerialLogger &operator<<(FlagsFn manip)
 {
   lock();
   manip(_stream_buf);
   unlock();
   return *this;
 }

 SerialLogger &operator()(TraceLevel_t e) {
   lock();
   _logLevel = e;
   unlock();
   return *this;
 }
 void flush();
 virtual ~SerialLogger();
 bool is_available(void) const override;

protected:
 virtual void lock(void) { _mutex.lock(); };
 virtual void unlock(void) { _mutex.unlock(); };
private:
 Stream &_serial;
 Mutex _mutex;
 std::stringstream _stream_buf;
 TraceLevel_t _logLevel;
};
Ну тут явно ещё напрашивается RAIIшная обёртка над lock/unlock
источник

v

vexillum in supapro.cxx
Т-34 85
погоди-погоди. Ты вчера задал вопрос, на него люди отвечали, а ты не стал ничего читать, задал ещё раз вопрос, я правильно понял?
вчера другой человек спрашивал
источник

Т8

Т-34 85 in supapro.cxx
Ilia Zviagin
Ой плохо...
есть идеи, как ТС к этому пришёл?
источник

D

Danya in supapro.cxx
Danya
Ну тут явно ещё напрашивается RAIIшная обёртка над lock/unlock
А учитывая что у тебя конкретный мьютекс лочится, для этого есть std::lock_guard
источник

v

vexillum in supapro.cxx
.
Ну да, я вообще написал отдельную функцию, которая принимает две строки, выделяет под всю длину + 1 новую строку и склеивает их через wcscat
у вас строки с wchar_t?
источник

.

. in supapro.cxx
vexillum
у вас строки с wchar_t?
Да
источник

IZ

Ilia Zviagin in supapro.cxx
Т-34 85
есть идеи, как ТС к этому пришёл?
Нет
источник

IZ

Ilia Zviagin in supapro.cxx
Т-34 85
есть идеи, как ТС к этому пришёл?
Может ты у него спросишь?
источник

s

std::slavik in supapro.cxx
std::slavik
class SerialLogger : public ILogging, public Singleton<SerialLogger> {
public:
 typedef std::ostream &(*ManipFn)(std::ostream &);
 typedef std::ios_base &(*FlagsFn)(std::ios_base &);

 SerialLogger();
 template <class T>  &operator<<(const T &output) {
   lock();
   _stream_buf << output;
   unlock();

   return *this;
 }

 SerialLogger &operator<<(ManipFn manip){
   lock();

   manip(_stream_buf);

   if (manip == static_cast<ManipFn>(std::flush) ||
       manip == static_cast<ManipFn>(std::endl)) {
     this->flush();
   }
   unlock();

   return *this;
 }

 SerialLogger &operator<<(FlagsFn manip)
 {
   lock();
   manip(_stream_buf);
   unlock();
   return *this;
 }

 SerialLogger &operator()(TraceLevel_t e) {
   lock();
   _logLevel = e;
   unlock();
   return *this;
 }
 void flush();
 virtual ~SerialLogger();
 bool is_available(void) const override;

protected:
 virtual void lock(void) { _mutex.lock(); };
 virtual void unlock(void) { _mutex.unlock(); };
private:
 Stream &_serial;
 Mutex _mutex;
 std::stringstream _stream_buf;
 TraceLevel_t _logLevel;
};
во flush сокращенно вот так делаю
void SerialLogger::flush() {
 if (is_available()) {
   if (get_trace_level() > TraceLevel_t::NONE) {
         std::cout << _stream_buf.str();
     }
} _stream_buf.str(std::string()); _stream_buf.clear();
}
источник

s

std::slavik in supapro.cxx
ну там еще по цветам текста и уровню трейсинга условия, немног не доделал
источник

s

std::slavik in supapro.cxx
Danya
Ну тут явно ещё напрашивается RAIIшная обёртка над lock/unlock
это какая
источник

s

std::slavik in supapro.cxx
вообще синхронный логгер временно пока, потом асинхронный над будет сделать, но интересно что за обертка
источник