Кресты / Говнокод #28999 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
template <typename T, typename... Ts>
struct StructureChain : T, StructureChain<Ts...>
{
	StructureChain(const T &t, const Ts&... a) : T(t), StructureChain<Ts...>(a...)
	{
		((T*)this)->pNext = (StructureChain<Ts...>*)this;
	}
};

template <typename T>
struct StructureChain<T> : T
{
	StructureChain(const T &t) : T(t){}
};

// Positional arguments? Im my C++?  It's more likely than you think!
template<typename T>
struct SetterFunc;
template<typename T, typename V>
struct SetterVal
{
	const SetterFunc<T> &func;
	const V &val;
	SetterVal(const SetterFunc<T> &f, const V &v) : func(f), val(v){}
};
template<typename T>
struct SetterFunc
{
	const T &func;
	SetterFunc(const T &data)
		: func(data)
	{}
	template <typename V>
	SetterVal<T,V> operator() (const V &v) {return SetterVal(*this,v);}
	template <typename V>
	SetterVal<T,V> operator= (const V &v) {return SetterVal(*this,v);}
};

template <typename T, typename... Ts>
void FillStructure(T &t, const Ts&... ts)
{
	auto filler = [](T &t, const auto &arg){
		auto T::*ptr = arg.func.func(t);
		t.*ptr = arg.val;
	};
	(filler(t,ts),...);
}
// todo: remove extra unused copy
#define $(k) SetterFunc([](auto a){return &decltype(a)::k;})

template <typename T, typename... Ts>
T $M(T t, const Ts&... ts)
{
	FillStructure(t, ts...);
	return t;
}
// ...
		VkSubresourceLayout layout = {0};
		layout.rowPitch = pitch1;

		StructureChain iinfo{
			$M(VkImageCreateInfo{VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO},
			   $(imageType) = VK_IMAGE_TYPE_2D,
			   $(format) = p010?VK_FORMAT_R16_UNORM:VK_FORMAT_R8_UNORM,
			   $(extent) = VkExtent3D{ WIDTH, HEIGHT, 1 },
			   $(mipLevels) = 1,
			   $(arrayLayers)= 1,
			   $(samples) =VK_SAMPLE_COUNT_1_BIT,
			   $(tiling) = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,
			   $(usage) = VK_IMAGE_USAGE_STORAGE_BIT,
			   $(sharingMode) = VK_SHARING_MODE_EXCLUSIVE
			   ),
			$M(VkExternalMemoryImageCreateInfo{VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO},
			   $(handleTypes) = VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT
			   ),
			$M(VkImageDrmFormatModifierExplicitCreateInfoEXT{VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT},
			   $(drmFormatModifierPlaneCount) = 1,
			   $(drmFormatModifier) =  mod,
			   $(pPlaneLayouts) = &layout
			)
		};
		VK_CHECK_RESULT(vkCreateImage(dev.device, &iinfo, NULL, &texture0.image)); // create image.

Positional arguments? Im my C++? It's more likely than you think!

Запостил: mittorn mittorn, (Updated )

Комментарии (4) RSS

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8