Attribute.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #ifndef _Attribute_h_
00042 #define _Attribute_h_
00043
00044 #include <stdint.h>
00045
00046 #include "boost/mpl/integral_c.hpp"
00047
00048 #include "util/endianness.h"
00049 #include "util/generic_endianess.h"
00050
00051 #include "object/PlacementNew.h"
00052
00053 #include "mw/attributes/access/Attribute_RT.h"
00054
00055 #include "mw/attributes/detail/AttributeSize.h"
00056 #include "mw/attributes/detail/AttributeAsserts.h"
00057 #include "mw/attributes/detail/ValueOffset.h"
00058 #include "mw/attributes/detail/ValueByteCount.h"
00059 #include "mw/attributes/detail/AttributeHeader.h"
00060 #include "mw/attributes/detail/AttributeElementHeader.h"
00061 #include "mw/attributes/detail/SmallestValueType.h"
00062 #include "mw/attributes/tags/IntegralConstTag.h"
00063 #include "mw/attributes/tags/AttributeTag.h"
00064
00065 #include "mw/attributes/detail/tags/TagSet.h"
00066 #include "mw/attributes/detail/tags/IsHighDensity.h"
00067 #include "mw/attributes/detail/tags/IsRequirable.h"
00068 #include "mw/attributes/detail/tags/HasLessThanRelation.h"
00069
00070 #include "config/type_traits/ByteCount.h"
00071
00072 #include "assert/staticerror.h"
00073
00074 namespace famouso {
00075 namespace mw {
00076 namespace attributes {
00077
00115 template <typename BaseType, typename CompareTag, typename ValueType,
00116 ValueType Value, uint8_t ID, typename TagSet = detail::TagSet<> >
00117 class Attribute : public famouso::mw::attributes::access::Attribute_RT {
00118 public:
00119
00120
00121 typedef boost::mpl::integral_c_tag tag;
00122
00123 typedef tags::attribute_tag type_tag;
00124 typedef CompareTag compare_tag;
00125 typedef BaseType base_type;
00126
00127
00128 typedef ValueType value_type;
00129
00130
00131 static const ValueType value = Value;
00132
00133
00134
00135 typedef typename
00136 detail::HasLessThanRelation::template get_comparator<TagSet>::type comparator;
00137
00138
00139 static const uint8_t id = ID;
00140
00141
00142 static const bool highDensity =
00143 TagSet::template contains_tag<detail::IsHighDensity>::value;
00144
00145
00146 static const bool requirable =
00147 TagSet::template contains_tag<detail::IsRequirable>::value;
00148
00149
00150
00151
00152 template <typename OtherAttr>
00153 struct isStronger :
00154 public comparator::template apply_compiletime<Attribute, OtherAttr> {
00155 FAMOUSO_STATIC_ASSERT_ERROR(
00156 requirable,
00157 only_requirable_attributes_may_have_a_stronger_relation,
00158 (Attribute));
00159 };
00160
00161
00162
00163 uint8_t data[detail::AttributeSize<Attribute>::value];
00164
00165 private:
00166
00167 typedef typename detail::ValueTypeAssert<value_type>::dummy valueTypeAssert;
00168 typedef typename detail::IdBitCountAssert<highDensity, id>::dummy idBitCountAssert;
00169
00170 protected:
00171 Attribute() {
00172
00173
00174
00175
00176
00177 if (BitCount<value_type, value>::value > 0) {
00178
00179
00180 typedef typename detail::SmallestValueType<
00181 ValueType, value
00182 >::type smallest_type;
00183
00184
00185 const smallest_type bigEndian = famouso::util::hton(static_cast<smallest_type>(value));
00186
00187 const uint8_t* ptr = reinterpret_cast<const uint8_t*> (&bigEndian);
00188
00189 ptr += sizeof(smallest_type) - 1;
00190
00191
00192
00193 uint8_t i = detail::AttributeSize<Attribute>::value-1;
00194
00195
00196
00197
00198 uint8_t j = detail::ValueByteCount<Attribute>::value;
00199 do {
00200 data[i--] = *ptr--;
00201 } while (--j != 0);
00202 } else {
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 if (highDensity) {
00215 data[0] = 0x00;
00216 }
00217 }
00218
00219
00220
00221
00222
00223 new (&data[0]) detail::AttributeHeader<Attribute> ;
00224 }
00225
00226 public:
00227 const ValueType getValue() const {
00228 return (Attribute_RT::getValue<ValueType>());
00229 }
00230
00231 const bool setValue(const ValueType newValue) {
00232 return (Attribute_RT::setValue<ValueType>(newValue));
00233 }
00234
00235 };
00236
00237 }
00238 }
00239 }
00240
00241 #endif // _Attribute_h_