Skip to content

Commit

Permalink
#14: adl/oct: Create Literal-named Units for Component Unit `adl/oct/…
Browse files Browse the repository at this point in the history
…var`

- Preliminar implementation of literal-named variables.
  • Loading branch information
flisboac committed Jun 12, 2017
1 parent be6da74 commit 980ce36
Show file tree
Hide file tree
Showing 7 changed files with 360 additions and 39 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ target_sources(${api} INTERFACE
"${api_dir_root}/adl/oct/var.hpp"
"${api_dir_root}/adl/oct/var/base_.hpp"
"${api_dir_root}/adl/oct/var/identity_.hpp"
"${api_dir_root}/adl/oct/var/view_named_.hpp"

# adl/oct/dsl
"${api_dir_root}/adl/oct/dsl.hpp"
Expand Down
4 changes: 4 additions & 0 deletions include/adl/oct.fwd.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,13 @@ template <typename VarType> struct var_traits;
//
template <typename VarType, typename VarTraits = var_traits<VarType>> class var_base_;
template <typename VarType, typename VarTraits = var_traits<VarType>> class unnamed_var_base_;
template <typename VarType, typename VarTraits = var_traits<VarType>> class lit_named_var_base_;

class oct_var;
class octdiff_var;
class oct_lvar;
class octdiff_lvar;


adl_END_MAIN_MODULE

Expand Down
1 change: 1 addition & 0 deletions include/adl/oct/var.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@

#include "adl/oct/var/base_.hpp"
#include "adl/oct/var/identity_.hpp"
#include "adl/oct/var/view_named_.hpp"

#endif //adl__oct__var__hpp__
158 changes: 151 additions & 7 deletions include/adl/oct/var/base_.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#ifndef adl__oct__var__base___hpp__
#define adl__oct__var__base___hpp__

#include <cstddef>
#include <iosfwd>

#include "adl.cfg.hpp"
Expand Down Expand Up @@ -34,6 +35,7 @@ namespace oct {
using var_id_type = typename var_id_traits::var_id_type;
using var_traits = VarTraits;
using var_type = VarType;
using ivar_type = typename var_traits::ivar_type;
using counterpart_var_type = typename var_traits::counterpart_var_type;

static_assert(var_traits::valid,
Expand All @@ -57,6 +59,8 @@ namespace oct {
constexpr var_base_& operator=(var_base_&&) = default;

// Constructors and assignments
constexpr var_base_(var_type const& base, long long int id) noexcept;
constexpr var_base_(counterpart_var_type const& base, long long int id) noexcept;
constexpr explicit var_base_(long long int id) noexcept;

// static construction functions
Expand Down Expand Up @@ -115,10 +119,12 @@ namespace oct {

// conversion functions
constexpr std::size_t to_index() const noexcept;
constexpr ivar_type to_ivar() const noexcept;
constexpr var_type const& as_valid() const;
constexpr var_type& as_valid();
constexpr var_type to_valid() const noexcept;
constexpr counterpart_var_type to_counterpart() const noexcept;
constexpr ivar_type to_id_var() const noexcept;
/* "virtual" std::string to_string() const; */

// conversion operators
Expand All @@ -145,6 +151,7 @@ namespace oct {

public:
using var_type = typename superclass_::var_type;
using counterpart_var_type = typename superclass_::counterpart_var_type;
using var_id_traits = typename superclass_::var_id_traits;
using superclass_::id;

Expand All @@ -164,13 +171,15 @@ namespace oct {

// constructors and assignments
constexpr explicit unnamed_var_base_(long long int id) noexcept;
constexpr unnamed_var_base_(var_type const& base, long long int id) noexcept;
constexpr unnamed_var_base_(counterpart_var_type const& base, long long int id) noexcept;

//
// PROPERTIES
//

// Properties
string_view name() const noexcept;
constexpr string_view name() const noexcept;

//
// CONVERSIONS
Expand All @@ -183,7 +192,61 @@ namespace oct {
explicit operator std::string() const;
};

template <typename VarType> constexpr void assert_valid_var_type() noexcept;
template <typename VarType, typename VarTraits>
class lit_named_var_base_ : public var_base_<VarType, VarTraits> {
private:
using superclass_ = var_base_<VarType, VarTraits>;

public:
using var_type = typename superclass_::var_type;
using counterpart_var_type = typename superclass_::counterpart_var_type;
using var_id_traits = typename superclass_::var_id_traits;
using ivar_type = typename superclass_::ivar_type;
using superclass_::id;

// constexpr static properties
constexpr static const bool named = false;

//
// CONSTRUCTION
//

// Defaulted/deleted members
constexpr lit_named_var_base_() = default;
constexpr lit_named_var_base_(const lit_named_var_base_&) = default;
constexpr lit_named_var_base_(lit_named_var_base_&&) = default;
constexpr lit_named_var_base_& operator=(const lit_named_var_base_&) = default;
constexpr lit_named_var_base_& operator=(lit_named_var_base_&&) = default;

// constructors and assignments
constexpr explicit lit_named_var_base_(long long int id) noexcept;
constexpr lit_named_var_base_(var_type const& base, long long int id) noexcept;
constexpr lit_named_var_base_(counterpart_var_type const& base, long long int id) noexcept;
constexpr explicit lit_named_var_base_(string_view name) noexcept;
constexpr lit_named_var_base_(long long int id, string_view name) noexcept;

//
// PROPERTIES
//

// Properties
constexpr string_view name() const noexcept;

//
// CONVERSIONS
//

// Conversion functions
std::string to_string() const;

// conversion operators
explicit operator std::string() const;

private:
string_view name_ { "", 0 };
};

template <typename VarType> constexpr void assert_valid_var_type() noexcept;
}

namespace operators {
Expand Down Expand Up @@ -274,6 +337,14 @@ template <typename VarType, typename VarTraits>
constexpr var_base_<VarType, VarTraits>::var_base_(long long int id) noexcept :
id_(id_to_range(id)) {}

template <typename VarType, typename VarTraits>
constexpr var_base_<VarType, VarTraits>::var_base_(var_type const& base, long long int id) noexcept :
id_(id_to_range(id)) {}

template <typename VarType, typename VarTraits>
constexpr var_base_<VarType, VarTraits>::var_base_(counterpart_var_type const& base, long long int id) noexcept :
id_(id_to_range(id)) {}

template <typename VarType, typename VarTraits>
constexpr typename var_base_<VarType, VarTraits>::var_id_type
var_base_<VarType, VarTraits>::id() const noexcept {
Expand Down Expand Up @@ -396,11 +467,22 @@ var_base_<VarType, VarTraits>::to_post_decremented(size_t offset) noexcept {
return with_id_(pid);
}

template <typename VarType, typename VarTraits>
constexpr typename var_base_<VarType, VarTraits>::ivar_type
var_base_<VarType, VarTraits>::to_id_var() const noexcept {
return ivar_type(id_);
}

template <typename VarType, typename VarTraits>
constexpr std::size_t var_base_<VarType, VarTraits>::to_index() const noexcept {
return var_id_traits::id_to_index(id_);
}

template <typename VarType, typename VarTraits>
constexpr var_base_<VarType, VarTraits>::to_ivar() const noexcept {
return ivar_type(id_);
}

template <typename VarType, typename VarTraits>
constexpr typename var_base_<VarType, VarTraits>::var_type const&
var_base_<VarType, VarTraits>::as_valid() const {
Expand All @@ -422,7 +504,7 @@ var_base_<VarType, VarTraits>::to_valid() const noexcept {
template <typename VarType, typename VarTraits>
constexpr typename var_base_<VarType, VarTraits>::counterpart_var_type
var_base_<VarType, VarTraits>::to_counterpart() const noexcept {
return var_traits::var_to_counterpart(as_subclass_(), var_id_traits::id_to_counterpart(id_));
return counterpart_var_type(as_subclass_(), var_id_traits::id_to_counterpart(id_));
}

template <typename VarType, typename VarTraits>
Expand Down Expand Up @@ -531,7 +613,7 @@ var_base_<VarType, VarTraits>::as_subclass_() const noexcept {
template <typename VarType, typename VarTraits>
constexpr typename var_base_<VarType, VarTraits>::var_type
var_base_<VarType, VarTraits>::with_id_(var_id_type new_id) const noexcept {
return var_traits::var_with_id(as_subclass_(), new_id);
return var_type(as_subclass_(), new_id);
}


Expand All @@ -544,7 +626,19 @@ constexpr unnamed_var_base_<VarType, VarTraits>::unnamed_var_base_(long long int
superclass_(id) {}

template <typename VarType, typename VarTraits>
adl_IMPL string_view unnamed_var_base_<VarType, VarTraits>::name() const noexcept {
constexpr unnamed_var_base_<VarType, VarTraits>::unnamed_var_base_(
var_type const& base,
long long int id) noexcept :
superclass_(base, id) {}

template <typename VarType, typename VarTraits>
constexpr unnamed_var_base_<VarType, VarTraits>::unnamed_var_base_(
counterpart_var_type const& base,
long long int id) noexcept :
superclass_(base, id) {}

template <typename VarType, typename VarTraits>
constexpr string_view unnamed_var_base_<VarType, VarTraits>::name() const noexcept {
return "";
}

Expand All @@ -558,6 +652,56 @@ adl_IMPL unnamed_var_base_<VarType, VarTraits>::operator std::string() const {
return to_string();
}


//
// lit_named_var_base_
//


template <typename VarType, typename VarTraits>
constexpr lit_named_var_base_<VarType, VarTraits>::lit_named_var_base_(long long int id) noexcept :
superclass_(id) {}

template <typename VarType, typename VarTraits>
constexpr lit_named_var_base_<VarType, VarTraits>::lit_named_var_base_(
var_type const& base,
long long int id) noexcept :
superclass_(base, id),
name_(base.name()) {}

template <typename VarType, typename VarTraits>
constexpr lit_named_var_base_<VarType, VarTraits>::lit_named_var_base_(
counterpart_var_type const& base,
long long int id) noexcept :
superclass_(base, id),
name_(base.name()) {}

template <typename VarType, typename VarTraits>
constexpr lit_named_var_base_<VarType, VarTraits>::lit_named_var_base_(string_view name) noexcept :
name_(name),
superclass_(var_id_traits::name_to_id(name)) {}

template <typename VarType, typename VarTraits>
constexpr lit_named_var_base_<VarType, VarTraits>::lit_named_var_base_(long long int id, string_view name) noexcept :
name_(name),
superclass_(id) {}

template <typename VarType, typename VarTraits>
constexpr string_view lit_named_var_base_<VarType, VarTraits>::name() const noexcept {
return name_;
}

template <typename VarType, typename VarTraits>
adl_IMPL std::string lit_named_var_base_<VarType, VarTraits>::to_string() const {
return var_id_traits::id_to_name(id(), std::string(name_.data(), name_.size()));
}

template <typename VarType, typename VarTraits>
adl_IMPL lit_named_var_base_<VarType, VarTraits>::operator std::string() const {
return to_string();
}


adl_END_MAIN_MODULE
adl_BEGIN_ROOT_MODULE

Expand Down Expand Up @@ -600,12 +744,12 @@ inline namespace iteration {
}

template <typename VarType, typename>
constexpr VarType& operator++(VarType& var, int) noexcept {
constexpr VarType operator++(VarType& var, int) noexcept {
return var.to_post_incremented();
}

template <typename VarType, typename>
constexpr VarType& operator--(VarType& var, int) noexcept {
constexpr VarType operator--(VarType& var, int) noexcept {
return var.to_post_decremented();
}

Expand Down
44 changes: 13 additions & 31 deletions include/adl/oct/var/identity_.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@
#ifndef adl__oct__var__identity___hpp__
#define adl__oct__var__identity___hpp__


#include "adl.cfg.hpp"

#include "adl/oct.fwd.hpp"
#include "adl/oct/domain_space.hpp"
#include "adl/oct/limits.hpp"
#include "adl/oct/traits.hpp"

#include "adl/oct/var/base_.hpp"


//
// [[ API ]]
//
Expand All @@ -18,6 +29,7 @@ struct adl_CLASS var_traits<oct_var> {
using var_id_type = typename var_id_traits::var_id_type;
using var_type = oct_var;
using counterpart_var_type = octdiff_var;
using ivar_type = var_type;

// Constexpr static values
constexpr static const bool valid = true;
Expand All @@ -37,6 +49,7 @@ struct adl_CLASS var_traits<octdiff_var> {
using var_id_type = typename var_id_traits::var_id_type;
using var_type = octdiff_var;
using counterpart_var_type = oct_var;
using ivar_type = var_type;

// Constexpr static values
constexpr static const bool valid = true;
Expand Down Expand Up @@ -71,18 +84,6 @@ namespace literals {

adl_END_MAIN_MODULE

template <typename Traits>
inline std::basic_ostream<char, Traits>& operator<<(
std::basic_ostream<char, Traits>& os,
const adl::oct::oct_var& var
);

template <typename Traits>
inline std::basic_ostream<char, Traits>& operator<<(
std::basic_ostream<char, Traits>& os,
const adl::oct::octdiff_var& var
);

//
// [[ TEMPLATE IMPLEMENTATION ]]
//
Expand Down Expand Up @@ -141,23 +142,4 @@ inline namespace oct {

adl_END_ROOT_MODULE

template <typename Traits>
std::basic_ostream<char, Traits>& operator<<(
std::basic_ostream<char, Traits>& os,
const adl::oct::octdiff_var& var
) {
using namespace adl::operators::oct::var::ios_;
return os << var;
}

template <typename Traits>
std::basic_ostream<char, Traits>& operator<<(
std::basic_ostream<char, Traits>& os,
const adl::oct::oct_var& var
) {
using namespace adl::operators::oct::var::ios_;
return os << var;
}


#endif //adl__oct__var__identity___hpp__
Loading

0 comments on commit 980ce36

Please sign in to comment.