rublon-ssh/PAM/ssh/include/rublon/static_string.hpp
rublon-bwi 627ef2a6b4
Bwi/v2.0.3 (#11)
* Remove unused options from rublon default config

* Remove safe|secure options

* Allow 9 digits long passcode for passcode bypass

* Change name of 'Mobile Passcode' to 'Passcode'

* Do not display any prompt when user is waiting

* remove unused alloca.h header

* Add autopushPrompt option

* Change name OTP method

* Change enrolement message handling

* add static string ctor

* Addded postrm script

* [bugfix] Restart sshd service after rublon package instalation

* Rename 01_rublon_ssh.conf to 01-rublon-ssh.conf

* Prepared scripts for generating rpm for alma nad rocky

* Adding public key authentication option

* Add postinst script and ssh configuration for using pubkey

* Add GCC 7 compatybility

* Cleanup includes, cleanup std::array usage

* Add Static String implementation

* Remove memory_resources

* Add monotonic_buffer_resource in experimental c++ imlpementation

* Use case insensitive map

* Remove not needed code
2024-09-03 20:28:12 +02:00

87 lines
2.3 KiB
C++

#pragma once
#include <array>
#include <cstddef>
#include <cstring>
#include <string_view>
#include <utility>
namespace rublon {
template < typename T, std::size_t N, std::size_t... Idx >
constexpr std::array< T, N > toStdArray(T (&arr)[N], std::index_sequence< Idx... >) {
return {arr[Idx]...};
}
template < std::size_t NewSize, typename T, std::size_t OldSize, std::size_t... Indexes >
constexpr std::array< T, NewSize > resize(const std::array< T, OldSize > & arr, std::index_sequence< Indexes... >) {
return {arr[Indexes]...};
}
template < std::size_t NewSize, typename T, std::size_t OldSize >
constexpr std::array< T, NewSize > resize(const std::array< T, OldSize > & arr) {
constexpr std::size_t minSize = std::min(OldSize, NewSize);
return resize(arr, std::make_index_sequence< minSize >());
}
namespace details {
class StaticStringBase {};
} // namespace details
// statically allocates a string buffer of (N+1) chars
template < size_t N >
class StaticString : public details::StaticStringBase {
public:
constexpr StaticString() = default;
constexpr StaticString(const char (&chars)[N]) : m_str(toStdArray(chars)) {}
constexpr StaticString(std::array< const char, N > chars) : m_str(std::move(chars)) {}
constexpr StaticString(const char * str) { std::strncpy(m_str.data(), str, N); }
void operator=(const char * str) {
std::strncpy(m_str.data(), str, N);
}
const char * c_str() const noexcept {
return m_str.data();
}
const char * data() const noexcept {
return m_str.data();
}
char * data() noexcept {
return m_str.data();
}
constexpr char & operator[](size_t pos) {
return m_str[pos];
}
constexpr const char & operator[](size_t pos) const {
return m_str[pos];
}
std::size_t size() const {
return strlen(m_str.data());
}
constexpr std::size_t capacity() const noexcept {
return N-1;
}
template < std::size_t M >
constexpr StaticString< N + M - 1 > operator+(const StaticString< M > & rhs) const {
return join(resize< N - 1 >(m_str), rhs.m_str);
}
template < std::size_t M >
friend class StaticString;
operator std::string_view () const {
return {m_str.data(), size()};
}
private:
std::array< char, N + 1 > m_str{};
};
} // namespace rublon