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

Last change on this file since 4599 was 4567, checked in by cameron, 4 years ago

Use llvm:raw_ostream in Pablo printer

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