ICG 2
Electric Boogaloo
BitfieldStructMember.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <sstream>
4 #include <iostream>
5 
6 #include "Type/StructMember.hpp"
7 #include "Value/IntegerValue.hpp"
8 
9 
10 
14 template <class T>
16 
17  public:
18 
25  BitfieldStructMember( std::string name,
26  T(*getter)(void* address),
27  void(*setter)(void* address, T value))
28  : StructMember(name) {
29 
30  get_bitfield_value = getter;
31  set_bitfield_value = setter;
32  }
33 
37  BitfieldStructMember ( const BitfieldStructMember<T> & original) : StructMember( original ) {
38 
39  get_bitfield_value = original.get_bitfield_value;
40  set_bitfield_value = original.set_bitfield_value;
41  }
42 
46  StructMember * clone () const {
47  return new BitfieldStructMember( *this );
48  }
49 
52  bool validate() { return true; }
53 
57  return MemberClass::BITFIELD;
58  }
59 
64 
68  ~BitfieldStructMember() { /* Nothing to do */ }
69 
72  void clearValue(void *struct_address) const {
73  (*set_bitfield_value)(struct_address, 0);
74  }
75 
78  void assignValue(void *struct_address, Value *v) const {
79  IntegerValue * integer_value_p = dynamic_cast<IntegerValue*>(v);
80  if (integer_value_p) {
81  T rvalue = integer_value_p->getIntegerValue();
82 
83  (*set_bitfield_value)( struct_address, rvalue );
84 
85  } else {
86  std::cerr << "ERROR: Attempt to assign non-integer value to a bitfield.";
87  }
88  }
89 
90  Value * getValue(void *struct_address) const {
91  // TODO: TEST ME
92  return new IntegerValue((*get_bitfield_value)( struct_address ));
93  }
94 
97  void printValue(std::ostream &s, void *struct_address) const {
98 
99  T value = (*get_bitfield_value)( struct_address );
100  s << value ;
101  }
102 
103  // void checkpointValue(std::ostream &s, std::string varName, void *struct_address) const {
104  // std::string full_member_name = varName + "." + getName();
105  // s << full_member_name << " = ";
106  // printValue(s, struct_address);
107  // s << ";" << std::endl;
108  // }
109 
110  std::string getTypeSpecName() const {
111  std::string s("<invalid-bitfield-type>");
112  return s;
113  }
114 
117  std::string toString() const {
118  std::ostringstream oss;
119  oss << getTypeSpecName() << " " << getName() << " : BITFIELD";
120  return oss.str();
121  }
122 
123  private:
124  T (* get_bitfield_value)(void* addr);
125  void (* set_bitfield_value)(void* addr, T value);
126 };
Definition: BitfieldStructMember.hpp:15
BitfieldStructMember< T > & operator=(const BitfieldStructMember< T > &rhs)=delete
~BitfieldStructMember()
Definition: BitfieldStructMember.hpp:68
void printValue(std::ostream &s, void *struct_address) const
Definition: BitfieldStructMember.hpp:97
StructMember * clone() const
Definition: BitfieldStructMember.hpp:46
std::string getTypeSpecName() const
Definition: BitfieldStructMember.hpp:110
std::string toString() const
Definition: BitfieldStructMember.hpp:117
BitfieldStructMember(std::string name, T(*getter)(void *address), void(*setter)(void *address, T value))
Definition: BitfieldStructMember.hpp:25
bool validate()
Definition: BitfieldStructMember.hpp:52
Value * getValue(void *struct_address) const
Definition: BitfieldStructMember.hpp:90
MemberClass::e getMemberClass() const
Definition: BitfieldStructMember.hpp:56
void clearValue(void *struct_address) const
Definition: BitfieldStructMember.hpp:72
BitfieldStructMember(const BitfieldStructMember< T > &original)
Definition: BitfieldStructMember.hpp:37
void assignValue(void *struct_address, Value *v) const
Definition: BitfieldStructMember.hpp:78
IntegerValue is a Value that represents an integer value on the right-hand-side of an equation.
Definition: IntegerValue.hpp:9
long long getIntegerValue() const
Definition: IntegerValue.cpp:28
Value is an abstract base-class that represents a value on the right-hand-side of an assignment.
Definition: Value.hpp:9
e
Definition: AllocInfo.hpp:23
Represent a normal or static member of a struct.
Definition: StructMember.hpp:11
std::string getName() const
Get the name of this struct member.
Definition: StructMember.hpp:59