OpenVDB 11.0.0
Loading...
Searching...
No Matches
Codecs.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: MPL-2.0
3
4#ifndef OPENVDB_AX_CODEGEN_CODECS_HAS_BEEN_INCLUDED
5#define OPENVDB_AX_CODEGEN_CODECS_HAS_BEEN_INCLUDED
6
7#include <openvdb/openvdb.h>
8#include <openvdb/version.h>
9
12
13namespace openvdb {
15namespace OPENVDB_VERSION_NAME {
16namespace ax {
17namespace codegen {
18
19class Codec;
20
21using CodecNameMap = std::map<const std::string, const Codec*>;
22using CodecTypeMap = std::map<const ast::tokens::CoreType, CodecNameMap>;
23using Codecs = std::vector<const Codec*>;
24
25/// @brief Get the global codec map
27
28/// @brief Get a specific codec. Returns a nullptr if no codec exists.
29/// @param type The type the codec encodes
30/// @param name The name of the codec
31OPENVDB_AX_API const Codec* getCodec(const ast::tokens::CoreType type, const std::string& name);
32
33/// @brief Get a specific set of codecs which encode a given type. Returns a
34/// nullptr if no codec exists.
35/// @param type The type the codecs encode
37
39{
40public:
41 using UniquePtr = std::unique_ptr<Codec>;
42
45 uint32_t flag)
46 : mEncoder(std::move(encoder))
47 , mDecoder(std::move(decoder))
48 , mFlag(flag) {
49#ifndef NDEBUG
50 assert(!mEncoder->list().empty());
51 assert(!mDecoder->list().empty());
52 assert(mEncoder->list().size() == mDecoder->list().size());
53 for (const auto& F : mEncoder->list()) {
54 assert(F->size() == 1 || F->size() == 2);
55 }
56#endif
57 }
58
59 /// @brief Given a core type supported by the AX frontend, return a llvm
60 /// compatible type which represents how the core type is encoded in
61 /// memory.
62 /// @return A llvm type representing the encoded C type. Can be a nullptr
63 /// if this codec does not support the provided core type.
64 llvm::Type* decodedToEncoded(const ast::tokens::CoreType& in, llvm::LLVMContext& C) const
65 {
66 // the input "decoded" type - unlike the encoded type, the decoded type
67 // has to be available as an AX "CoreType" which is why this function
68 // takes a CoreType in
69 llvm::Type* type = codegen::llvmTypeFromToken(in, C);
70 // For each encoder function in this codec, find the one which
71 // one takes the provided "in" decoded type and return the type
72 // of that function return signature
73 llvm::Type* ret = findReturnTypeFromArg(this->encoder(), type->getPointerTo());
74 return ret ? ret->getPointerElementType() : nullptr;
75 }
76
77 /// @brief Given a llvm type, return a compatible llvm type which
78 /// represents how the provided type should be exposed to the AX frontend.
79 /// @note The return type is guaranteed to either be a supported CoreType
80 /// (such that ax::codegen::tokenFromLLVMType(in) returns a valid value)
81 /// or a nullptr.
82 /// @return A llvm type representing the decoded C type. Can be a nullptr
83 /// if this codec does not support the provided core type.
84 llvm::Type* encodedToDecoded(llvm::Type* in) const
85 {
86 // For each decoder function in this codec, find the one which
87 // one takes the provided "in" encoded type and return the type
88 // of that function return signature
89 if (!in->isPointerTy()) in = in->getPointerTo();
90 llvm::Type* ret = findReturnTypeFromArg(this->decoder(), in);
91 return ret ? ret->getPointerElementType() : nullptr;
92 }
93
94 const codegen::FunctionGroup* encoder() const { return mEncoder.get(); }
95 const codegen::FunctionGroup* decoder() const { return mDecoder.get(); }
96 inline uint32_t flag() const { return mFlag; }
97
98private:
99 llvm::Type* findReturnTypeFromArg(const codegen::FunctionGroup* const, llvm::Type*) const;
100
103 const uint32_t mFlag;
104};
105
106
107} // namespace codegen
108} // namespace ax
109} // namespace OPENVDB_VERSION_NAME
110} // namespace openvdb
111
112#endif // OPENVDB_AX_CODEGEN_CODECS_HAS_BEEN_INCLUDED
113
Contains frameworks for creating custom AX functions which can be registered within the FunctionRegis...
#define OPENVDB_AX_API
Definition Platform.h:295
Various function and operator tokens used throughout the AST and code generation.
Codec(codegen::FunctionGroup::UniquePtr encoder, codegen::FunctionGroup::UniquePtr decoder, uint32_t flag)
Definition Codecs.h:43
llvm::Type * encodedToDecoded(llvm::Type *in) const
Given a llvm type, return a compatible llvm type which represents how the provided type should be exp...
Definition Codecs.h:84
llvm::Type * decodedToEncoded(const ast::tokens::CoreType &in, llvm::LLVMContext &C) const
Given a core type supported by the AX frontend, return a llvm compatible type which represents how th...
Definition Codecs.h:64
const codegen::FunctionGroup * encoder() const
Definition Codecs.h:94
const codegen::FunctionGroup * decoder() const
Definition Codecs.h:95
std::unique_ptr< Codec > UniquePtr
Definition Codecs.h:41
uint32_t flag() const
Definition Codecs.h:96
CoreType
Definition Tokens.h:32
std::map< const ast::tokens::CoreType, CodecNameMap > CodecTypeMap
Definition Codecs.h:22
OPENVDB_AX_API const CodecNameMap * getTypeSupportedCodecs(const ast::tokens::CoreType type)
Get a specific set of codecs which encode a given type. Returns a nullptr if no codec exists.
std::map< const std::string, const Codec * > CodecNameMap
Definition Codecs.h:21
OPENVDB_AX_API const CodecTypeMap & getCodecTypeMap()
Get the global codec map.
OPENVDB_AX_API const Codec * getCodec(const ast::tokens::CoreType type, const std::string &name)
Get a specific codec. Returns a nullptr if no codec exists.
std::vector< const Codec * > Codecs
Definition Codecs.h:23
Definition Exceptions.h:13
Definition Coord.h:589
todo
Definition FunctionTypes.h:793
std::unique_ptr< FunctionGroup > UniquePtr
Definition FunctionTypes.h:795
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:212