The usual commit from 1 year later with changes that I don't recognise

This commit is contained in:
King_DuckZ 2020-04-07 22:40:14 +02:00
parent ebfcc6f6ac
commit 7b3df1b14a
3 changed files with 87 additions and 0 deletions

View file

@ -0,0 +1,45 @@
/*
* Copyright 2015-2018 Michele "King_DuckZ" Santullo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#if defined VWR_OUTER_NAMESPACE
namespace VWR_OUTER_NAMESPACE {
#endif
namespace vwr {
template <typename V, typename Storage>
class forward_wrapper {
public:
forward_wrapper() { new(&m_storage) V; }
forward_wrapper (const forward_wrapper&) = delete;
forward_wrapper (forward_wrapper&&) = delete;
~forward_wrapper() { vector().~V(); }
forward_wrapper& operator= (const forward_wrapper&) = delete;
forward_wrapper& operator= (forward_wrapper&&) = delete;
private:
V& vector() { return *reinterpret_cast<V*>(&m_storage); }
//const V& vector() const { return *reinterpret_cast<const V*>(&m_storage); }
Storage m_storage;
};
} //namespace vwr
#if defined VWR_OUTER_NAMESPACE
} //namespace VWR_OUTER_NAMESPACE
#endif

View file

@ -15,6 +15,7 @@
*/ */
#include "vectorwrapper/vectorwrapper.hpp" #include "vectorwrapper/vectorwrapper.hpp"
#include "vectorwrapper/forward_wrapper.hpp"
#include <gtest/gtest.h> #include <gtest/gtest.h>
namespace { namespace {

41
testme.cpp Normal file
View file

@ -0,0 +1,41 @@
#include <iostream>
template <typename T>
int get_at (const T&, int);
struct XY {
int x, y;
};
template <> int get_at(const int(&in)[2], int i) { return in[i]; }
template <> int get_at(const XY& in, int i) { return (i ? in.y : in.x); }
template <typename T>
struct Vec {
int x() const { return get_at(m_storage_type, 0); }
int y() const { return get_at(m_storage_type, 1); }
T m_storage_type;
};
template <typename T>
std::ostream& operator<< (std::ostream& os, const Vec<T>& v) {
os << '<' << v.x() << ',' << v.y() << '>';
return os;
}
int main() {
Vec<int[2]> v1;
Vec<XY> v2;
v1.m_storage_type[0] = 1234;
v1.m_storage_type[1] = 7777;
v2.m_storage_type.x = 44;
v2.m_storage_type.y = 9999;
std::cout << v1 << '\n';
std::cout << v2 << '\n';
return 0;
}