14 #ifndef TSA_SUPPORT__INCLUDED 15 #define TSA_SUPPORT__INCLUDED 25 #include "TSATypeDef.h" 26 #include "TSAString.h" 40 std::atomic<bool> m_value;
42 spin_lock() : m_value(false) { };
43 void lock(){
while (m_value.exchange(
true));}
44 void unlock(){m_value.store(
false);}
45 bool is_locked(){
return m_value.load();}
56 class queue :
public object {
58 mutable std::mutex m_mutex;
59 std::queue<T> m_data_queue;
60 std::condition_variable m_data_cond;
64 std::lock_guard<std::mutex> lk(m_mutex);
65 m_data_queue.push(value);
66 m_data_cond.notify_one();
69 void wait_and_pop(T& value) {
70 std::unique_lock<std::mutex> lk(m_mutex);
71 m_data_cond.wait(lk, [
this] {
return !m_data_queue.empty(); });
72 value = m_data_queue.front();
76 bool wait_until_and_pop(T& value,
const std::chrono::microseconds& usec) {
77 std::unique_lock<std::mutex> lk(m_mutex);
78 auto now = std::chrono::system_clock::now();
79 if (m_data_cond.wait_until(lk,
80 now + usec, [
this] {return !m_data_queue.empty(); }))
82 tsa_assert(!m_data_queue.empty());
83 value = m_data_queue.front();
87 else {
return false; }
90 bool try_pop(T& value) {
91 std::lock_guard<std::mutex> lk(m_mutex);
92 if (m_data_queue.empty()) {
95 value = m_data_queue.front();
111 class dll_export named_values :
public tsa::object{
112 std::map<std::string, variant> m_map;
117 named_values(
const named_values& other);
119 named_values(named_values&& other);
121 virtual ~named_values(
void);
123 void operator=(
const named_values& other);
125 void operator=(named_values&& other);
127 void from_string(
const std::string& property_string);
129 void from_file(
const os::path&);
133 const variant& operator[](
const std::string& key)
const;
135 void set(
const std::string& key,
const variant& value);
137 void add(
const std::string& key,
const variant& value);
139 void add(
const std::pair<std::string, variant>& pair);
147 void remove(
const std::string& key,
bool error_on_missing_key =
true);
149 size_t size(
void)
const;
151 void print(std::ostream&)
const;
155 void print_values(std::ostream& stream)
const;
159 typedef named_values named_args;
170 std::chrono::steady_clock::time_point m_Begin;
171 std::chrono::steady_clock::time_point m_End;
208 const timer& stop(
void);
214 double seconds(
void)
const;
220 double milliseconds(
void)
const;
222 static clock_t machine_cycles(
void);
226 std::ostream& operator<<(std::ostream&,
const timer&);
231 virtual ~Initializer() { ; }
232 virtual void Initialize() { ; }
242 void incr_ref(
void) {
245 void decr_ref(
void) {
246 tsa_assert(m_ref_count > 0);
249 size_t num_ref(
void) {
255 template<
typename TYPE>
256 class dll_export singleton :
public object {
257 tsa_declare_testable;
258 static std::mutex m_mutex;
262 static TYPE*
get(
bool bCreate =
true);
263 static void set(TYPE*);
264 static void reset(
void);
266 static TYPE* m_object_ptr;
269 template<
typename TYPE>
270 TYPE* singleton<TYPE>::m_object_ptr =
nullptr;
272 template<
typename TYPE>
273 std::mutex singleton<TYPE>::m_mutex;
275 template<
typename TYPE>
276 TYPE* singleton<TYPE>::get(
bool create_if_not_exist) {
277 std::lock_guard<std::mutex> lock(singleton<TYPE>::m_mutex);
278 if (m_object_ptr ==
nullptr && create_if_not_exist) {
279 m_object_ptr = (TYPE*)
new TYPE();
280 tsa_assert(m_object_ptr !=
nullptr);
281 ((TYPE&)*m_object_ptr).Initialize();
286 template<
typename TYPE>
287 void singleton<TYPE>::set(TYPE* pObj) {
288 std::lock_guard<std::mutex> lock(singleton<TYPE>::m_mutex);
292 template<
typename TYPE>
293 void singleton<TYPE>::reset() {
294 std::lock_guard<std::mutex> lock(singleton<TYPE>::m_mutex);
297 m_object_ptr =
nullptr;
302 class ASCII_LineGraph :
public object {
303 tsa_declare_testable;
317 std::vector<HLC> m_DataHLC;
318 std::vector<HL> m_BarArr;
319 std::vector<HL> m_TmpBarArr;
323 double m_dCellHeight;
325 std::vector<size_t> m_yValues;
326 std::vector<string> m_yLegend;
334 void ClearMatrix(
void);
335 void ClearData(
void);
336 void MakeYBarArray(
void);
337 void FindMinMax(
void);
338 void DeriveGraphMetrics(
void);
339 int CalcYValue(
double dataValue);
340 void SetPixels(
void);
341 void SetAt(
int x,
int y,
char _Val);
342 char at(
int x,
int y);
344 ASCII_LineGraph(
size_t height = 20,
size_t width = 65);
345 virtual ~ASCII_LineGraph(
void);
346 void SetBarChar(
char close,
char bar);
347 void AddBar(
double high,
double low,
double close,
const date_time& timestamp);
348 void AddDataItem(
double close,
const date_time& timestamp);
350 void ProcessData(
void);
351 void SetLeftMargin(
size_t);
352 void Print(std::ostream& _s);
353 void SetData(std::vector<double>& _data);
356 class dll_export TablePrinter :
public object {
357 tsa_declare_testable;
359 enum Allignment { Left, Right };
371 std::vector<Field> m_Fields;
372 std::vector<string> m_Content;
373 size_t m_nRightCellBuffer;
374 size_t m_nLeftCellBuffer;
375 size_t GetNumFields(
void)
const;
376 string ConvertToString(
size_t fieldIdx,
const variant&)
const;
377 bool m_nUseSeparator;
378 char m_nSeparatorChar;
379 bool m_LineAfterTitle;
380 size_t m_nNumRecPrinted;
383 size_t m_nSeparatorInterval;
384 size_t m_nHeaderReprintInterval;
386 size_t m_LeftTableMargin;
387 bool m_bSeparateThousands;
388 bool m_bPrintBoolAsString;
389 bool m_bOverrideIndividualPrecision;
390 size_t m_nFPPrecision;
392 static const size_t DEFAULT_PRECISION = 10;
395 virtual ~TablePrinter(
void);
396 void AddBoolField(
const tsa::string& name, Allignment);
397 void AddLongField(
const tsa::string& name, Allignment);
398 void AddStringField(
const tsa::string& name, Allignment);
399 void AddDoubleField(
const tsa::string& name, Allignment,
400 size_t precision = TablePrinter::DEFAULT_PRECISION);
401 void AddDateTimeField(
const tsa::string& name, Allignment allign,
bool dateOnly =
false,
404 void SetDrawBorders(
bool);
405 void SetPrintBoolAsString(
bool bFlag);
406 void SetSeparatorInterval(
size_t);
407 void SetHeaderReprintInterval(
size_t);
408 void SetCellBuffers(
size_t left,
size_t right);
409 void SetPrintHeader(
bool);
410 void SetLeftTableMargin(
size_t);
411 void SetSeparateThousands(
bool);
412 void SetPrecision(
size_t nPrecision);
413 void AnalyzeRecord(
const std::vector<variant>&
record);
414 void PrintHeader(std::ostream&,
bool isReprint =
false);
415 void PrintTopGridLine(std::ostream&,
char c =
'_');
416 void PrintBottomGridLine(std::ostream&,
char c =
'_');
417 void PrintRecord(
const std::vector<variant>&
record, std::ostream& stream,
Namespace for the 'Trading System API' library.
Definition: original1.TSA3Core.cpp:20
Start the timer immediately upon construction.
Definition: TSASupport.h:182
variant objects can represent values of different types.
Definition: TSAVariant.h:140
_value_types_type
Data type enumeration used throughout the library. Intended to be used via type_t.
Definition: TSATypeDef.h:166
Construct the timer object, but do not start timing.
Definition: TSASupport.h:180
Parent class for many library classes.
Definition: TSATypeDef.h:462
A timer.
Definition: TSASupport.h:169
Class representing a database record.
Definition: TSADBRecord.h:52
init_flag
Timer constructor flag.
Definition: TSASupport.h:178
Class representing a gregorian-date and time-of-day combination. The time component has microsecond r...
Definition: TSATime.h:428