source: icGREP/icgrep-devel/icgrep-1.00/pablo/pe_string.h @ 4529

Last change on this file since 4529 was 4512, checked in by nmedfort, 5 years ago

Fix for printing out Name strings

File size: 1.9 KB
Line 
1#ifndef PE_STRING_H
2#define PE_STRING_H
3
4#include <pablo/pabloAST.h>
5#include <llvm/ADT/StringRef.h>
6#include <llvm/ADT/Twine.h>
7#include <llvm/ADT/SmallVector.h>
8#include <string>
9#include <ostream>
10
11namespace pablo {
12
13class String : public PabloAST {
14    friend class SymbolGenerator;
15    friend std::ostream & operator<< (std::ostream& stream, const String & string);
16public:
17    using StringAllocator = SlabAllocator<char>;
18    using Value = StringRef;
19
20    static inline bool classof(const PabloAST * e) {
21        return e->getClassTypeId() == ClassTypeId::String;
22    }
23    static inline bool classof(const void *) {
24        return false;
25    }
26    virtual ~String(){
27
28    }
29    inline const StringRef & value() const {
30        return mValue;
31    }
32    inline std::string to_string() const {
33        return mValue.str();
34    }
35    inline StringRef value() {
36        return mValue;
37    }
38    inline bool isGenerated() const {
39        return mGenerated;
40    }
41    inline bool isUserDefined() const {
42        return !mGenerated;
43    }
44protected:
45    String(const std::string & value, const bool generated) noexcept
46    : PabloAST(ClassTypeId::String)
47    , mValue(duplicate(value))
48    , mGenerated(generated)
49    {
50
51    }
52    inline const char * duplicate(const std::string & value) {
53        char * string = reinterpret_cast<char*>(mAllocator.allocate(value.length() + 1));
54        std::memcpy(string, value.c_str(), value.length());
55        string[value.length()] = '\0';
56        return string;
57    }
58private:
59    const StringRef         mValue;
60    const bool              mGenerated;
61};
62
63inline std::ostream & operator <<(std::ostream & stream, const String & string) {
64    stream << string.value().data();
65    return stream;
66}
67
68inline std::ostream & operator <<(std::ostream & stream, const String * string) {
69    stream << string->value().data();
70    return stream;
71}
72
73}
74
75#endif // PE_STRING_H
Note: See TracBrowser for help on using the repository browser.