// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef rr_ExecutableMemory_hpp
#define rr_ExecutableMemory_hpp

#include <cstddef>
#include <cstdint>
#include <cstring>

namespace rr {

size_t memoryPageSize();

void *allocateExecutable(size_t bytes);   // Allocates memory that can be made executable using markExecutable()
void markExecutable(void *memory, size_t bytes);
void deallocateExecutable(void *memory, size_t bytes);

template<typename P>
P unaligned_read(P *address)
{
	P value;
	memcpy(&value, address, sizeof(P));
	return value;
}

template<typename P, typename V>
void unaligned_write(P *address, V value)
{
	static_assert(sizeof(V) == sizeof(P), "value size must match pointee size");
	memcpy(address, &value, sizeof(P));
}

template<typename P>
class unaligned_ref
{
public:
	explicit unaligned_ref(void *ptr) : ptr((P*)ptr) {}

	template<typename V>
	P operator=(V value)
	{
		unaligned_write(ptr, value);
		return value;
	}

	operator P()
	{
		return unaligned_read((P*)ptr);
	}

private:
	P *ptr;
};

template<typename P>
class unaligned_ptr
{
	template<typename S>
	friend class unaligned_ptr;

public:
	unaligned_ptr(P *ptr) : ptr(ptr) {}

	unaligned_ref<P> operator*()
	{
		return unaligned_ref<P>(ptr);
	}

	template<typename S>
	operator S()
	{
		return S(ptr);
	}

private:
	void *ptr;
};

}  // namespace rr

#endif   // rr_ExecutableMemory_hpp
