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

Last change on this file since 5239 was 5230, checked in by nmedfort, 3 years ago

Multi-threading support for PabloAST / PabloCompiler?. Requires unique LLVM Context / Module for each thread.

File size: 2.1 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    }
40protected:
41    String(Type * type, const std::string & value, Allocator & allocator) noexcept
42    : PabloAST(ClassTypeId::String, type, this, allocator)
43    , mValue(duplicate(value, allocator)) {
44
45    }
46
47    inline const char * duplicate(const std::string & value, Allocator & allocator) {
48        char * string = reinterpret_cast<char*>(allocator.allocate<char*>(value.length() + 1));
49        std::memcpy(string, value.c_str(), value.length());
50        string[value.length()] = '\0';
51        return string;
52    }
53private:
54    const StringRef         mValue;
55};
56
57inline std::ostream & operator <<(std::ostream & stream, const String & string) {
58    stream << string.value().data();
59    return stream;
60}
61
62inline std::ostream & operator <<(std::ostream & stream, const String * string) {
63    stream << string->value().data();
64    return stream;
65}
66
67inline llvm::raw_ostream & operator <<(llvm::raw_ostream & stream, const String & string) {
68    stream << string.value().data();
69    return stream;
70}
71
72inline llvm::raw_ostream & operator <<(llvm::raw_ostream & stream, const String * string) {
73    stream << string->value().data();
74    return stream;
75}
76
77
78}
79
80#endif // PE_STRING_H
Note: See TracBrowser for help on using the repository browser.