]> git.tdb.fi Git - libs/datafile.git/blob - source/statement.cpp
Use default member initializers for constant initial values
[libs/datafile.git] / source / statement.cpp
1 #include <msp/strings/format.h>
2 #include "statement.h"
3 #include "token.h"
4 #include "type.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace DataFile {
10
11 Statement::Statement(const string &kw):
12         keyword(kw),
13         valid(true),
14         control(!kw.compare(0, 2, "__"))
15 { }
16
17 string Statement::get_location() const
18 {
19         string result = source;
20         if(line)
21                 result += format(":%d", line);
22         return result;
23 }
24
25 string Statement::get_signature() const
26 {
27         string result;
28         for(const Value &a: args)
29                 result += a.get_signature();
30         return result;
31 }
32
33 Statement &Statement::append_from_token(const Token &token)
34 {
35         if(token.type==Token::INTEGER)
36                 return append(lexical_cast<IntType::Store>(token.str, Fmt().autobase()));
37         else if(token.type==Token::FLOAT)
38                 return append(lexical_cast<FloatType::Store>(token.str));
39         else if(token.type==Token::STRING)
40                 return append(token.str);
41         else if(token.type==Token::IDENTIFIER)
42         {
43                 if(token.str=="true")
44                         return append(true);
45                 else if(token.str=="false")
46                         return append(false);
47                 else
48                         return append(Value(Symbol(token.str)));
49         }
50         else
51                 throw invalid_argument("Statement::append_from_token");
52 }
53
54
55 StatementInfo::StatementInfo(const string &k, const string &s):
56         key(k, s),
57         args_size(0)
58 {
59         for(char c: key.signature)
60         {
61                 arg_offsets.push_back(args_size);
62                 switch(c)
63                 {
64                 case IntType::signature:
65                         args_size += sizeof(IntType::Store);
66                         break;
67                 case FloatType::signature:
68                         args_size += sizeof(FloatType::Store);
69                         break;
70                 case BoolType::signature:
71                         args_size += sizeof(BoolType::Store);
72                         break;
73                 case StringType::signature:
74                         args_size += sizeof(StringType::Store);
75                         break;
76                 case SymbolType::signature:
77                         args_size += sizeof(SymbolType::Store);
78                         break;
79                 }
80         }
81 }
82
83 } // namespace DataFile
84 } // namespace Msp