KiCad PCB EDA Suite
SEXPR::SEXPR Class Reference

#include <sexpr.h>

Inheritance diagram for SEXPR::SEXPR:
SEXPR::SEXPR_DOUBLE SEXPR::SEXPR_INTEGER SEXPR::SEXPR_LIST SEXPR::SEXPR_STRING SEXPR::SEXPR_SYMBOL

Public Member Functions

virtual ~SEXPR ()
 
bool IsList () const
 
bool IsSymbol () const
 
bool IsString () const
 
bool IsDouble () const
 
bool IsInteger () const
 
void AddChild (SEXPR *aChild)
 
SEXPR_VECTOR const * GetChildren () const
 
SEXPRGetChild (size_t aIndex) const
 
size_t GetNumberOfChildren () const
 
int64_t GetLongInteger () const
 
int32_t GetInteger () const
 
float GetFloat () const
 
double GetDouble () const
 
std::string const & GetString () const
 
std::string const & GetSymbol () const
 
SEXPR_LISTGetList ()
 
std::string AsString (size_t aLevel=0) const
 
size_t GetLineNumber () const
 

Protected Member Functions

 SEXPR (SEXPR_TYPE aType, size_t aLineNumber)
 
 SEXPR (SEXPR_TYPE aType)
 

Protected Attributes

SEXPR_TYPE m_type
 
size_t m_lineNumber
 

Detailed Description

Definition at line 45 of file sexpr.h.

Constructor & Destructor Documentation

◆ ~SEXPR()

virtual SEXPR::SEXPR::~SEXPR ( )
inlinevirtual

Definition at line 48 of file sexpr.h.

48 {};

◆ SEXPR() [1/2]

SEXPR::SEXPR::SEXPR ( SEXPR_TYPE  aType,
size_t  aLineNumber 
)
protected

Definition at line 28 of file sexpr.cpp.

28  :
29  m_type( aType ), m_lineNumber( aLineNumber )
30  {
31  }
size_t m_lineNumber
Definition: sexpr.h:72
SEXPR_TYPE m_type
Definition: sexpr.h:69

◆ SEXPR() [2/2]

SEXPR::SEXPR::SEXPR ( SEXPR_TYPE  aType)
protected

Definition at line 33 of file sexpr.cpp.

33  :
34  m_type( aType ), m_lineNumber( 1 )
35  {
36  }
size_t m_lineNumber
Definition: sexpr.h:72
SEXPR_TYPE m_type
Definition: sexpr.h:69

Member Function Documentation

◆ AddChild()

void SEXPR::SEXPR::AddChild ( SEXPR aChild)

Definition at line 58 of file sexpr.cpp.

59  {
61  {
62  throw INVALID_TYPE_EXCEPTION("SEXPR is not a list type!");
63  }
64 
65  SEXPR_LIST* list = static_cast< SEXPR_LIST * >( this );
66 
67  list->m_children.push_back( aChild );
68  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_LIST::m_children, and SEXPR::SEXPR_TYPE_LIST.

Referenced by BOOST_AUTO_TEST_CASE(), SEXPR::SEXPR_LIST::doAddChildren(), and SEXPR::operator<<().

◆ AsString()

std::string SEXPR::SEXPR::AsString ( size_t  aLevel = 0) const

Definition at line 151 of file sexpr.cpp.

152  {
153  std::string result;
154 
155  if( IsList() )
156  {
157  if( aLevel != 0 )
158  {
159  result = "\n";
160  }
161 
162  result.append( aLevel * 2, ' ' );
163  aLevel++;
164  result += "(";
165 
166  SEXPR_VECTOR const* list = GetChildren();
167 
168  for( std::vector<SEXPR *>::const_iterator it = list->begin(); it != list->end(); ++it )
169  {
170  result += (*it)->AsString( aLevel );
171 
172  if( it != list->end() - 1 )
173  {
174  result += " ";
175  }
176  }
177  result += ")";
178 
179  aLevel--;
180  }
181  else if( IsString() )
182  {
183  result += "\"" + GetString() + "\"";
184  }
185  else if( IsSymbol() )
186  {
187  result += GetSymbol();
188  }
189  else if( IsInteger() )
190  {
191  std::stringstream out;
192  out << GetInteger();
193  result += out.str();
194  }
195  else if( IsDouble() )
196  {
197  std::stringstream out;
198  out << std::setprecision( 16 ) << GetDouble();
199  result += out.str();
200  }
201 
202  return result;
203  }
std::vector< class SEXPR * > SEXPR_VECTOR
Definition: sexpr.h:43
bool IsString() const
Definition: sexpr.h:51
std::string const & GetString() const
Definition: sexpr.cpp:80
bool IsSymbol() const
Definition: sexpr.h:50
bool IsList() const
Definition: sexpr.h:49
bool IsDouble() const
Definition: sexpr.h:52
int32_t GetInteger() const
Definition: sexpr.cpp:90
double GetDouble() const
Definition: sexpr.cpp:105
std::string const & GetSymbol() const
Definition: sexpr.cpp:128
SEXPR_VECTOR const * GetChildren() const
Definition: sexpr.cpp:38
bool IsInteger() const
Definition: sexpr.h:53

Referenced by BOOST_TEST_PRINT_NAMESPACE_OPEN::print_log_value< SEXPR::SEXPR >::operator()(), and KI_TEST::SexprConvertsToString().

◆ GetChild()

SEXPR * SEXPR::SEXPR::GetChild ( size_t  aIndex) const

Definition at line 48 of file sexpr.cpp.

49  {
51  {
52  throw INVALID_TYPE_EXCEPTION("SEXPR is not a list type!");
53  }
54 
55  return static_cast< SEXPR_LIST const * >(this)->m_children[aIndex];
56  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_LIST.

Referenced by BOOST_AUTO_TEST_CASE(), SEXPR::SEXPR_LIST::doScan(), SEXPR::operator>>(), and traverseSEXPR().

◆ GetChildren()

SEXPR_VECTOR const * SEXPR::SEXPR::GetChildren ( ) const

Definition at line 38 of file sexpr.cpp.

39  {
41  {
42  throw INVALID_TYPE_EXCEPTION("SEXPR is not a list type!");
43  }
44 
45  return &static_cast< SEXPR_LIST const * >(this)->m_children;
46  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_LIST.

◆ GetDouble()

double SEXPR::SEXPR::GetDouble ( ) const

Definition at line 105 of file sexpr.cpp.

106  {
107  // we may end up parsing "intended" floats/doubles as ints
108  // so here we allow silent casting back to doubles
110  {
111  return static_cast< SEXPR_DOUBLE const * >(this)->m_value;
112  }
114  {
115  return static_cast< SEXPR_INTEGER const * >(this)->m_value;
116  }
117  else
118  {
119  throw INVALID_TYPE_EXCEPTION("SEXPR is not a double type!");
120  }
121  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_ATOM_DOUBLE, and SEXPR::SEXPR_TYPE_ATOM_INTEGER.

Referenced by KI_TEST::SexprIsDoubleWithValue().

◆ GetFloat()

float SEXPR::SEXPR::GetFloat ( ) const

Definition at line 123 of file sexpr.cpp.

124  {
125  return static_cast< float >( GetDouble() );
126  }
double GetDouble() const
Definition: sexpr.cpp:105

◆ GetInteger()

int32_t SEXPR::SEXPR::GetInteger ( ) const

Definition at line 90 of file sexpr.cpp.

91  {
92  return static_cast< int >( GetLongInteger() );
93  }
int64_t GetLongInteger() const
Definition: sexpr.cpp:95

◆ GetLineNumber()

size_t SEXPR::SEXPR::GetLineNumber ( ) const
inline

Definition at line 66 of file sexpr.h.

66 { return m_lineNumber; }
size_t m_lineNumber
Definition: sexpr.h:72

◆ GetList()

SEXPR_LIST * SEXPR::SEXPR::GetList ( )

Definition at line 141 of file sexpr.cpp.

142  {
144  {
145  throw INVALID_TYPE_EXCEPTION("SEXPR is not a list type!");
146  }
147 
148  return static_cast< SEXPR_LIST* >(this);
149  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_LIST.

◆ GetLongInteger()

int64_t SEXPR::SEXPR::GetLongInteger ( ) const

Definition at line 95 of file sexpr.cpp.

96  {
98  {
99  throw INVALID_TYPE_EXCEPTION("SEXPR is not a integer type!");
100  }
101 
102  return static_cast< SEXPR_INTEGER const * >(this)->m_value;
103  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_ATOM_INTEGER.

Referenced by KI_TEST::SexprIsIntegerWithValue().

◆ GetNumberOfChildren()

size_t SEXPR::SEXPR::GetNumberOfChildren ( ) const

Definition at line 70 of file sexpr.cpp.

71  {
73  {
74  throw INVALID_TYPE_EXCEPTION("SEXPR is not a list type!");
75  }
76 
77  return static_cast< SEXPR_LIST const * >(this)->m_children.size();
78  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_LIST.

Referenced by KI_TEST::SexprIsListOfLength(), and traverseSEXPR().

◆ GetString()

std::string const & SEXPR::SEXPR::GetString ( ) const

Definition at line 80 of file sexpr.cpp.

81  {
83  {
84  throw INVALID_TYPE_EXCEPTION("SEXPR is not a string type!");
85  }
86 
87  return static_cast< SEXPR_STRING const * >(this)->m_value;
88  }
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_ATOM_STRING.

Referenced by KI_TEST::SexprIsStringWithValue().

◆ GetSymbol()

std::string const & SEXPR::SEXPR::GetSymbol ( ) const

Definition at line 128 of file sexpr.cpp.

129  {
131  {
132  std::string err_msg( "GetSymbol(): SEXPR is not a symbol type! error line ");
133  err_msg += std::to_string( GetLineNumber() );
134  throw INVALID_TYPE_EXCEPTION( err_msg );
135  }
136 
137  return static_cast< SEXPR_SYMBOL const * >(this)->m_value;
138  }
size_t GetLineNumber() const
Definition: sexpr.h:66
SEXPR_TYPE m_type
Definition: sexpr.h:69

References SEXPR::SEXPR_TYPE_ATOM_SYMBOL.

Referenced by KI_TEST::SexprIsSymbolWithValue().

◆ IsDouble()

bool SEXPR::SEXPR::IsDouble ( ) const
inline

◆ IsInteger()

bool SEXPR::SEXPR::IsInteger ( ) const
inline

◆ IsList()

bool SEXPR::SEXPR::IsList ( ) const
inline

Definition at line 49 of file sexpr.h.

References SEXPR::SEXPR_TYPE_LIST.

Referenced by KI_TEST::getType(), and traverseSEXPR().

◆ IsString()

bool SEXPR::SEXPR::IsString ( ) const
inline

◆ IsSymbol()

bool SEXPR::SEXPR::IsSymbol ( ) const
inline

Member Data Documentation

◆ m_lineNumber

size_t SEXPR::SEXPR::m_lineNumber
protected

Definition at line 72 of file sexpr.h.

◆ m_type

SEXPR_TYPE SEXPR::SEXPR::m_type
protected

Definition at line 69 of file sexpr.h.


The documentation for this class was generated from the following files: