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

Last change on this file since 4680 was 4680, checked in by nmedfort, 4 years ago

Added pablo Prototype to compiler. All Calls must be given one instead of a Name.

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