diff options
Diffstat (limited to 'src/std')
| -rw-r--r-- | src/std/conversion.cpp | 32 | ||||
| -rw-r--r-- | src/std/conversion.hpp | 31 | ||||
| -rw-r--r-- | src/std/memory.hpp | 33 | ||||
| -rw-r--r-- | src/std/memory.tpp | 94 | ||||
| -rw-r--r-- | src/std/smart_string.cpp | 65 | ||||
| -rw-r--r-- | src/std/smart_string.hpp | 20 | ||||
| -rw-r--r-- | src/std/time.cpp | 37 | ||||
| -rw-r--r-- | src/std/time.hpp | 55 | 
8 files changed, 367 insertions, 0 deletions
| diff --git a/src/std/conversion.cpp b/src/std/conversion.cpp new file mode 100644 index 0000000..a2a624d --- /dev/null +++ b/src/std/conversion.cpp @@ -0,0 +1,32 @@ +#include "conversion.hpp" + +UniquePtr<SmartString> doubleToStr(double num, unsigned int width, unsigned int precision) +{ +	auto str = make_unique<SmartString>(width + precision); + +	dtostrf(num, static_cast<signed char>(width), precision, str->c_str); + +	return str; +} + +UniquePtr<SmartString> intToStr(int num) +{ +	auto width = static_cast<unsigned int>(log10(num)); + +	auto str = make_unique<SmartString>(width + 1U); + +	dtostrf(num, static_cast<signed char>(width + 1U), 0, str->c_str); + +	return str; +} + +UniquePtr<SmartString> uintToStr(unsigned int num) +{ +	auto width = static_cast<unsigned int>(log10(num)); + +	auto str = make_unique<SmartString>(width + 1U); + +	dtostrf(num, static_cast<signed char>(width + 1U), 0, str->c_str); + +	return str; +} diff --git a/src/std/conversion.hpp b/src/std/conversion.hpp new file mode 100644 index 0000000..726ce88 --- /dev/null +++ b/src/std/conversion.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include "std/memory.hpp" +#include "std/smart_string.hpp" + +/** + * Converts a double number to a string. + * + * @param num A double number + * @param width The desired double width + * @param precision The desired double precision + * @returns The double as a string. + */ +UniquePtr<SmartString> doubleToStr(double num, unsigned int width = 3, +								   unsigned int precision = 2); + +/** + * Converts a integer to a string. + * + * @param num A number + * @returns The number as a string. + */ +UniquePtr<SmartString> intToStr(int num); + +/** + * Converts a unsigned integer to a string. + * + * @param num A number + * @returns The number as a string. + */ +UniquePtr<SmartString> uintToStr(unsigned int num); diff --git a/src/std/memory.hpp b/src/std/memory.hpp new file mode 100644 index 0000000..e870b0b --- /dev/null +++ b/src/std/memory.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include <stddef.h> + +template <typename memType> +memType *malloc_s(unsigned int size); + +template <class Target> +class UniquePtr +{ +public: +	explicit UniquePtr(); +	explicit UniquePtr(Target *target); +	UniquePtr(const UniquePtr &unique_ptr); +	UniquePtr(UniquePtr &&unique_ptr) noexcept; + +	UniquePtr &operator=(const UniquePtr &unique_ptr); + +	UniquePtr &operator=(UniquePtr &&unique_ptr) noexcept; + +	~UniquePtr(); + +	Target operator*() const; +	Target *operator->() const; + +private: +	Target *_target = nullptr; +}; + +template <typename Target, typename... Args> +UniquePtr<Target> make_unique(Args... args); + +#include "memory.tpp" diff --git a/src/std/memory.tpp b/src/std/memory.tpp new file mode 100644 index 0000000..fbfcd32 --- /dev/null +++ b/src/std/memory.tpp @@ -0,0 +1,94 @@ +#pragma once + +#include "utils.hpp" + +#include <Arduino.h> +#include <stdlib.h> + +template <typename memType> +memType *malloc_s(unsigned int size) +{ +	auto *mem = malloc(size); + +	if (mem == nullptr) +	{ +		Serial.println("Error: Memory allocation failed"); +		while (true) {} +	} + +	return static_cast<memType *>(mem); +} + +template <class Target> +UniquePtr<Target>::UniquePtr() = default; + +template <class Target> +UniquePtr<Target>::UniquePtr(Target *target) : _target(target) +{ +} + +template <class Target> +UniquePtr<Target>::UniquePtr(const UniquePtr &unique_ptr) +	: _target(new Target(*(unique_ptr._target))) +{ +} + +template <class Target> +UniquePtr<Target>::UniquePtr(UniquePtr &&unique_ptr) noexcept +	: _target(unique_ptr._target) +{ +	unique_ptr._target = nullptr; +} + +template <class Target> +UniquePtr<Target> &UniquePtr<Target>::operator=(const UniquePtr &unique_ptr) +{ +	if (&unique_ptr != this) +	{ +		delete _target; +		_target = nullptr; +		_target = new Target(*(unique_ptr._target)); +	} + +	return *this; +} + +template <class Target> +UniquePtr<Target> &UniquePtr<Target>::operator=(UniquePtr &&unique_ptr) noexcept +{ +	if (&unique_ptr != this) +	{ +		delete _target; +		_target = unique_ptr._target; +		unique_ptr._target = nullptr; +	} + +	return *this; +} + +template <class Target> +UniquePtr<Target>::~UniquePtr() +{ +	if (this->_target != nullptr) +	{ +		delete this->_target; +	} +} + +template <class Target> +Target UniquePtr<Target>::operator*() const +{ +	return *(this->_target); +} + +template <class Target> +Target *UniquePtr<Target>::operator->() const +{ +	return this->_target; +} + +template <class Target, typename... Args> +UniquePtr<Target> make_unique(Args... args) +{ +	return UniquePtr<Target>(new Target(args...)); +} diff --git a/src/std/smart_string.cpp b/src/std/smart_string.cpp new file mode 100644 index 0000000..b24a1a5 --- /dev/null +++ b/src/std/smart_string.cpp @@ -0,0 +1,65 @@ +#include "smart_string.hpp" + +#include "std/memory.hpp" + +#include <stdlib.h> + +SmartString::SmartString(char *c_string) : c_str(c_string) +{ +} + +SmartString::SmartString(unsigned int size) : c_str(malloc_s<char>(size + 1)) +{ +} + +SmartString::SmartString(const SmartString &smart_str) +	: c_str(malloc_s<char>(strlen(smart_str.c_str) + 1)) +{ +	memcpy(c_str, smart_str.c_str, strlen(smart_str.c_str) + 1); +} + +SmartString::SmartString(SmartString &&smart_str) noexcept : c_str(smart_str.c_str) +{ +	smart_str.c_str = nullptr; +} + +SmartString &SmartString::operator=(const SmartString &smart_str) +{ +	if (&smart_str != this) +	{ +		free(c_str); +		c_str = nullptr; + +		auto str_size = strlen(smart_str.c_str) + 1; + +		c_str = malloc_s<char>(str_size); +		memcpy(c_str, smart_str.c_str, str_size); +	} + +	return *this; +} + +SmartString &SmartString::operator=(SmartString &&smart_str) noexcept +{ +	if (&smart_str != this) +	{ +		free(c_str); +		c_str = smart_str.c_str; +		smart_str.c_str = nullptr; +	} + +	return *this; +} + +SmartString::~SmartString() +{ +	if (c_str != nullptr) +	{ +		free(c_str); +	} +} + +SmartString::operator char *() const +{ +	return c_str; +} diff --git a/src/std/smart_string.hpp b/src/std/smart_string.hpp new file mode 100644 index 0000000..6390465 --- /dev/null +++ b/src/std/smart_string.hpp @@ -0,0 +1,20 @@ +#pragma once + +class SmartString +{ +public: +	explicit SmartString(char *c_str); +	explicit SmartString(unsigned int size); +	SmartString(const SmartString &smart_str); +	SmartString(SmartString &&smart_str) noexcept; + +	SmartString &operator=(const SmartString &smart_str); + +	SmartString &operator=(SmartString &&smart_str) noexcept; + +	~SmartString(); + +	explicit operator char *() const; + +	char *c_str = nullptr; +}; diff --git a/src/std/time.cpp b/src/std/time.cpp new file mode 100644 index 0000000..cca8955 --- /dev/null +++ b/src/std/time.cpp @@ -0,0 +1,37 @@ +#include "time.hpp" + +#include <Arduino.h> + +Time::Time(uint64_t time_micros) : _time_micros(time_micros) +{ +} + +void Time::update() +{ +	_time_micros = micros(); +} + +Time Time::diff(Time prev_time) const +{ +	return Time(_time_micros - prev_time.microsecs()); +} + +double Time::secs() const +{ +	return static_cast<double>(_time_micros) * MICROS_TO_SECS; +} + +double Time::millisecs() const +{ +	return static_cast<double>(_time_micros) * MICROS_TO_MILLIS; +} + +uint64_t Time::microsecs() const +{ +	return _time_micros; +} + +Time time_now() +{ +	return Time(micros()); +} diff --git a/src/std/time.hpp b/src/std/time.hpp new file mode 100644 index 0000000..a544a5a --- /dev/null +++ b/src/std/time.hpp @@ -0,0 +1,55 @@ +#pragma once + +#include <stdint.h> + +constexpr double MICROS_TO_SECS = 0.000001; +constexpr double MICROS_TO_MILLIS = 0.001; + +/** + * A representation of time. + */ +class Time +{ +public: +	/** +	 * A representation of time. +	 * +	 * @param time_micros Time in microseconds +	 */ +	explicit Time(uint64_t time_micros); + +	/** +	 * Updates the time to the current time. +	 */ +	void update(); + +	/** +	 * Returns the difference between two points in time. +	 * +	 * @param prev_time A previous point in time +	 */ +	Time diff(Time prev_time) const; + +	/** +	 * Returns the time in seconds. +	 */ +	double secs() const; + +	/** +	 * Returns the time in milliseconds. +	 */ +	double millisecs() const; + +	/** +	 * Returns the time in microseconds. +	 */ +	uint64_t microsecs() const; + +private: +	uint64_t _time_micros; +}; + +/** + * Returns a time object for the time since the program started. + */ +Time time_now(); | 
